0

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

4

1 回答 1

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 read 循环。

  3. awk 用空格分隔字段:

    • $1: '刀'
    • $2:“死”
    • $3: 'nw' 左右
    • $4: 0001.png

    尝试将其$4-1解析为数字并减一,因此“.png”被切断。然后只需将值组合在printf

  4. 最后移动文件。双引号 " 很重要!

在移动之前,请通过替换为进行测试mv运行echo

echo "$file" "$new_name"
于 2013-07-31T18:24:14.667 回答