使用一行命令重命名文件

gue*_*tli 10 command-line bash batch-rename

我有这个目录,想重命名文件:

===> 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
Run Code Online (Sandbox Code Playgroud)

结果应如下所示:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...
Run Code Online (Sandbox Code Playgroud)

我想用常用的 shell 工具来解决这个问题。

Zan*_*nna 18

你可以用rename...

rename -n 's/^[0-9]+ - //' *
Run Code Online (Sandbox Code Playgroud)

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

解释

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

  • @guettli 严格来说,不,它不是 PCRE(那是 Perl *兼容 * 正则表达式)。`rename` 是一个 Perl 脚本,因此它具有完整的 Perl 正则表达式支持;PCRE 只是其中的一个子集。但是,您从 PCRE 中了解到的任何内容都适用于“重命名”。 (5认同)

hee*_*ayl 9

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

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done
Run Code Online (Sandbox Code Playgroud)

展开形式:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done
Run Code Online (Sandbox Code Playgroud)

echo用于干运行;摆脱它以采取实际行动:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done
Run Code Online (Sandbox Code Playgroud)

例子:

% 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
Run Code Online (Sandbox Code Playgroud)