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)
我该怎么做呢?
替代方案/扩展/警告
...
for i in ./DSCN*JPG; do mv "$i" "$(echo "$i" | tr A-Z a-z)" ; done
Run Code Online (Sandbox Code Playgroud)
适用于无限数量的文件,从文件中读取名称列表
从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)
一些 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)
我还没有测试过这个,但我相信它会根据需要创建目录。