尝试使用mac os x上的sed重命名文件时出错

时间:2013-07-30 17:16:14

标签: macos sed mv

我有一组从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)。

1 个答案:

答案 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
  1. 使用文件名中的空格迭代ls输出不是一个好主意。 find可以更好地处理特殊文件名。

  2. 由于您需要存储信息(数字或新名称),我建议使用while读取循环。

  3. Awk用空格分隔字段:

    • $1:'knifer'
    • $2:'垂死'
    • $3:'nw'左右
    • $4:0001.png

    $4-1尝试使用将其解析为数字并减去1,因此'.png'被截断。 然后只需合并printf

  4. 中的值
  5. 最后移动文件。双引号“很重要!
  6. 在移动之前,请使用mv

    替换echo进行测试运行
    echo "$file" "$new_name"