我有一组从0001开始按顺序编号的文件。我想要完成的是重命名改变文件的名称,同时保留一些部分(如nw,w)完整并启动编号从0000开始。
我的原始文件名如下:
knifer dying nw 0001.png
knifer dying nw 0002.png
knifer dying nw 0003.png
knifer dying nw 0004.png
knifer dying nw 0005.png
knifer dying nw 0006.png
knifer dying nw 0007.png
knifer dying nw 0008.png
knifer dying nw 0009.png
knifer dying w 0001.png
knifer dying w 0002.png
knifer dying w 0003.png
knifer dying w 0004.png
knifer dying w 0005.png
knifer dying w 0006.png
knifer dying w 0007.png
knifer dying w 0008.png
knifer dying w 0009.png
我想要完成的是让它看起来像这样:
knifer_die_nw_0000.png <-- notice the _, the change of dying, keeping nw intact, and 0000
knifer_die_nw_0001.png
knifer_die_nw_0002.png
knifer_die_nw_0003.png
knifer_die_nw_0004.png
knifer_die_nw_0005.png
knifer_die_nw_0006.png
knifer_die_nw_0007.png
knifer_die_nw_0008.png
knifer_die_w_0000.png
knifer_die_w_0001.png
knifer_die_w_0002.png
knifer_die_w_0003.png
knifer_die_w_0004.png
knifer_die_w_0005.png
knifer_die_w_0006.png
knifer_die_w_0007.png
knifer_die_w_0008.png
我尝试编写一个使用sed执行此操作的脚本。下面是我用来将0001转换为0000的命令。对于其他数字,我计划包括从0002到0001,0003到0002等的更改。因此,通过将其转换为10行bash脚本,我计划实现目标。
ls knifer*dying* | sed -E 's/knifer( |_)dying( |_)([a-z]{1,2})( ){1,2}0001(.*)/mv & knifer_die_\3_0000\5/'
mv knifer dying nw 0001.png knifer_die_nw_0000.png
knifer dying nw 0002.png
knifer dying nw 0003.png
knifer dying nw 0004.png
knifer dying nw 0005.png
knifer dying nw 0006.png
knifer dying nw 0007.png
knifer dying nw 0008.png
knifer dying nw 0009.png
mv knifer dying sw 0001.png knifer_die_sw_0000.png
knifer dying sw 0002.png
knifer dying sw 0003.png
knifer dying sw 0004.png
knifer dying sw 0005.png
knifer dying sw 0006.png
knifer dying sw 0007.png
knifer dying sw 0008.png
knifer dying sw 0009.png
我得到了我需要的输出。现在,如果我尝试使用 sh或bash 执行它,问题就出现了,我收到以下错误:
ls knifer*dying* | sed -E 's/knifer( |_)dying( |_)([a-z]{1,2})( ){1,2}0001(.*)/mv & knifer_die_\3_0000\5/' | sh
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
sh: line 2: knifer: command not found
sh: line 3: knifer: command not found
sh: line 4: knifer: command not found
sh: line 5: knifer: command not found
sh: line 6: knifer: command not found
sh: line 7: knifer: command not found
sh: line 8: knifer: command not found
sh: line 9: knifer: command not found
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
sh: line 11: knifer: command not found
sh: line 12: knifer: command not found
sh: line 13: knifer: command not found
sh: line 14: knifer: command not found
sh: line 15: knifer: command not found
sh: line 16: knifer: command not found
sh: line 17: knifer: command not found
sh: line 18: knifer: command not found
知道怎么解决这个问题吗?我是Mac OS X Mountain Lion(10.8.4)。
答案 0 :(得分:1)
试试这个:
find . -name 'knifer*dying*' -print | while read file; do
new_name=$(echo "$file" | awk ' { printf "knifer_die_%s_%04d.png", $3, $4-1 } ')
mv "$file" "$new_name"
done
使用文件名中的空格迭代ls
输出不是一个好主意。 find
可以更好地处理特殊文件名。
由于您需要存储信息(数字或新名称),我建议使用while读取循环。
Awk用空格分隔字段:
$1
:'knifer'$2
:'垂死'$3
:'nw'左右$4
:0001.png $4-1
尝试使用将其解析为数字并减去1,因此'.png'被截断。
然后只需合并printf
在移动之前,请使用mv
echo
进行测试运行
echo "$file" "$new_name"