批量重命名文件

X T*_*ian 4 command-line shell rename

我有一个充满图像的目录:

DSCN4749.JPG
DSCN4750.JPG
DSCN4892.JPG
...
Run Code Online (Sandbox Code Playgroud)

我想要一个单线将它们重命名为(比如说)。

dscn4749.jpg
dscn4750.jpg
dscn4892.jpg
...
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

替代方案/扩展/警告

  • 我想递归
  • 该目录包含混合文件类型,我只想重命名 DSCN*.JPG 文件。
  • bash 解决方案
  • perl 解决方案
  • zsh解决方案
  • 我想要一个带有硬链接现有文件的新目录树。
  • 我想更改名称不仅仅是更改大小写,例如 dscn5555.JPG 到 05555.jpg

...

小智 10

使用 perl 重命名

rename 'y/A-Z/a-z/' *
Run Code Online (Sandbox Code Playgroud)


X T*_*ian 7

POSIX sh for 循环

for i in ./DSCN*JPG; do mv "$i" "$(echo "$i" | tr A-Z a-z)" ; done
Run Code Online (Sandbox Code Playgroud)

bash while 循环

适用于无限数量的文件,从文件中读取名称列表

find命令中读取名称。

find . -maxdepth 1 -type f -name 'DSCN*JPG' | while IFS= read -r f; do
  mv -v "$f" "$( tr A-Z a-z <<< $f )"
done
Run Code Online (Sandbox Code Playgroud)

读取名为 flist 的文件中的名称列表

while IFS= read -r f; do mv -v "$f" "$( tr A-Z a-z <<<$f )"; done < flist
Run Code Online (Sandbox Code Playgroud)


Jul*_*les 5

一些 linux 发行版有一个名为“mmv”的程序(例如debian)。这可以根据文件名的模式匹配执行重命名。在您的情况下,您想要的命令是:

mmv 'DSCN*.JPG' 'dscn#1.jpg'
Run Code Online (Sandbox Code Playgroud)

它解释文件名模式本身,而不是依赖于 shell 扩展,所以请记住引用通配符。在目标模式中,#1指的是源模式中的第一个通配符等等。我建议跑步

mmv -n 'DSCN*.JPG' 'dscn#1.jpg'
Run Code Online (Sandbox Code Playgroud)

首先,它将给出将作为试运行执行的操作列表。

它还可以处理递归重命名,使用特殊;模式(匹配任意数量的子目录级别,类似于**其他一些工具使用的模式)。所以要递归地执行这个操作,命令是:

mmv ';DSCN*.jpg' '#1dscn#2.jpg'
Run Code Online (Sandbox Code Playgroud)

它还可以处理文件名本身的大小写转换,因此,例如,如果您不确定所有文件都以 DSCN 前缀开头,则以下方法可行:

mmv '*.JPG' '#l1.jpg'
Run Code Online (Sandbox Code Playgroud)

甚至

mmv '*' '#l1'
Run Code Online (Sandbox Code Playgroud)

或者

mmv ';*' '#1#l2'
Run Code Online (Sandbox Code Playgroud)

递归执行重命名。

可以使用以下-l选项生成带有原始文件硬链接的新目录树:

mmv -l ';DSCN*.JPG' '../output/#1dscn#2.jpg'
Run Code Online (Sandbox Code Playgroud)

我还没有测试过这个,但我相信它会根据需要创建目录。