使用一行命令重命名文件


10

我有此目录,并且想要重命名文件:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

结果应如下所示:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

我想用普通的外壳工具解决这个问题。


1
我想用普通的外壳工具解决这个问题。我并不是说您没有充分的理由,但是我相信您已经向自己问过并回答了一个问题“为什么?”。上一次我有一个非常相似的问题要解决时,我立即将Bash推到一边,并用Python解决了它。如此简单(但我确实已经了解Python,字符串方法,glob.glob和os.rename,而且我还必须递归到一棵充满文件夹名的树上,并带有空格和其他尴尬的字符,这些都不是多余的原因如果使用Python则麻烦)
nigel222

1
@ nigel222我很懒,我想输入尽可能少的字符。这就是为什么我不想在这里使用python的原因。不要误会我的意思。到目前为止,Python是我首选的编程语言,并且每天都在使用它。
guettli

Answers:


18

您可以使用rename...

rename -n 's/^[0-9]+ - //' *

-n经过测试后删除以实际重命名文件

说明

  • s/old/new/替换oldnew
  • ^ 字符串开始
  • [0-9]+ 一些数字

rename工具支持哪种正则表达式花。它使用PCRE吗?... 会很好。
guettli

5
@guettli严格来说,不是PCRE(这是Perl 兼容的正则表达式)。这rename是一个Perl脚本,因此具有完整的Perl正则表达式支持;PCRE只是其中的一部分。但是,您从PCRE了解到的任何信息都将适用于rename
terdon

@terdon我不在乎实现。如果您使用数学眼镜来查看它,那么它具有与renameperl兼容的正则表达式。是的,不会使用pcre实现。我理解这一点:-)谢谢您的快速回复。
guettli

9

bash 参数扩展以从开始剥离掉所需的部分:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

展开形式:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echo用于空转;摆脱它的实际行动:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

例:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

是的,可以。谢谢。由于我从Python(我每天都使用)知道perl兼容的正则表达式,因此我更喜欢该rename命令。(无需输入)。
guettli

1
@guettli rename是去,如果你熟悉PCRE的方式; 该rename答案已经给出所以必须用纯移动bash。请注意,pythonre(或regex)模块与PCRE完全不兼容。
heemayl

@guettli您是否也否决了我的答案?:O
heemayl

是的,我做到了,我赞成你的评论。希望您不要自己考虑。不要误会我的意思,但我个人认为这${f#[[:digit:]]*-[[:blank:]]}很丑。是的,它有效。但是我们生活在21世纪。我认为是时候从“有效”过渡到“简单而有趣”了。如果“有效”是目标,那么linux将永远不会失去对用户友好的偏见。由于您已经获得了很多赞成票,因此这一赞成票应该不会受到伤害(我希望如此)。如果是这样,请告诉我,我会把它收回。
guettli

1
@guettli任何适合您的。在这里:gnu.org/software/bash/manual/html_node/…请注意,字符类[[:digit:]][[:blank:]]在那里符合您的规范locale在Regex中也很常见。
heemayl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.