根据序列号重命名匹配的文件

时间:2018-11-11 22:23:17

标签: bash find rename

假设我有一堆Mac屏幕截图文件:

Screen Shot 2018-11-09 at 12.37.37 PM.png
Screen Shot 2018-11-10 at 4.53.02 PM.png
Screen Shot 2018-11-10 at 9.19.19 PM.png

我想用mv将它们标记为:

Screen_0.png
Screen_1.png
Screen_2.png

我想出的部分命令:

find . -name "Screen*" -exec sh -c 'mv "$1" "Screen_$2"' _ {} ??? \;

如何实现命令以使其可以按数字标记图像?还是我不得不求助于更复杂的文件。

4 个答案:

答案 0 :(得分:2)

我认为无法按照您希望的方式传递序列号xargs。而是使用一个简单的循环:

#!/bin/bash
for file in Screen*.png; do
  [[ -f $file ]] || continue # skip if not a regular file
  mv "$file" "Screen_$((count++)).png"
done

答案 1 :(得分:2)

您可以只使用rename,也就是Perl重命名:

rename --dry-run 's/.*/Screen_$N.png/' Screenshot*png

示例输出

'Screenshot 2018-11-12 at 11.54.32.png' would be renamed to 'Screen_1.png'
'Screenshot 2018-11-12 at 11.54.38.png' would be renamed to 'Screen_2.png'
'Screenshot 2018-11-12 at 11.54.42.png' would be renamed to 'Screen_3.png'

如果您喜欢输出的外观,请在没有--dry-run的情况下再次运行。


如果您使用的是macOS,则可以使用 homebrew 安装Perl rename

brew install rename

答案 2 :(得分:1)

如果使用数组,则无需进行任何算术运算,只需使用每个元素的索引即可:

#!/bin/bash
files=('Screen Shot'*.png)
for i in "${!files[@]}" ; do
    mv "${files[i]}" Screen_$i.png
done

答案 3 :(得分:1)

使用Perl一个衬板,您也可以轻松做到。

> ls -1 Screen*
Screen Shot 2018-11-09 at 12.37.37 PM.png
Screen Shot 2018-11-10 at 4.53.02 PM.png
Screen Shot 2018-11-10 at 9.19.19 PM.png
> perl -ne ' BEGIN { for(glob("Screen*")) {  rename "$_", "Screen_".$x++.".png" } ; exit }'
> ls -1 Screen*
Screen_0.png
Screen_1.png
Screen_2.png
>