重命名文件夹名称中的文件时出现Bash脚本问题

时间:2013-11-26 14:12:25

标签: bash unix batch-rename

我有一个bash脚本,不会产生我期望的结果。它旨在重命名文件夹结构中的文件,使文件可以在文件夹结构之外进行排序。

从包含10-20张CD光盘的典型音频书中翻录文件结构。最上面的文件夹是一个Title文件夹,其中包含每个光盘的文件夹,01,02,03等。

像这样:

TITLE / 01 / File 01.wav,File 02.wav etc.
        02 / File 01.wav,File 02.wav etc.
        03 / File 01.wav,File 02.wav etc.
        etc...

使用文件夹名称重命名文件的脚本如下所示:

cd "$@"


pwd

IFS=$'\n'; for f in $(find "$PWD" -name '*.wav'); do folder=${f%/*}; file=${f##*/}; echo ${folder##*/}"/"$file "-->" ${folder##*/}$(printf %03d "${file%% *}") ${file#* } >> rename_log.out;  mv "$f" "$folder/${folder##*/}$(printf %03d "${file%% *}") ${file#* }";done

问题是当它重命名文件08和09时会发生奇怪的事情。我无法弄清楚它为什么会发生。

以下是run(rename_log.out)的输出日志文件:

01/01 - Track 01.wav --> 01001 - Track 01.wav
01/02 - Track 02.wav --> 01002 - Track 02.wav
01/03 - Track 03.wav --> 01003 - Track 03.wav
01/04 - Track 04.wav --> 01004 - Track 04.wav
01/05 - Track 05.wav --> 01005 - Track 05.wav
01/06 - Track 06.wav --> 01006 - Track 06.wav
01/07 - Track 07.wav --> 01007 - Track 07.wav
01/08 - Track 08.wav --> 01000 - Track 08.wav
01/09 - Track 09.wav --> 01000 - Track 09.wav
01/10 - Track 10.wav --> 01010 - Track 10.wav
01/11 - Track 11.wav --> 01011 - Track 11.wav
01/12 - Track 12.wav --> 01012 - Track 12.wav
01/13 - Track 13.wav --> 01013 - Track 13.wav
01/14 - Track 14.wav --> 01014 - Track 14.wav
01/15 - Track 15.wav --> 01015 - Track 15.wav
01/16 - Track 16.wav --> 01016 - Track 16.wav

通知曲目8& 9以及它们如何重命名。我希望它们是01008& 01009但他们不是。我错过了什么?

非常感谢任何帮助。

//约翰

1 个答案:

答案 0 :(得分:2)

重新格式化并修复。

cd "$@"
pwd
IFS=$'\n'
for f in $(find "$PWD" -name '*.wav'); do
  folder=${f%/*}
  file=${f##*/}
  echo ${folder##*/}"/"$file "-->" ${folder##*/}$(printf %03d "$(( 10#${file%% *} ))") ${file#* } >> rename_log.out
  mv "$f" "$folder/${folder##*/}$(printf %03d "$(( 10#${file%% *} ))") ${file#* }"
done

注意八进制到十进制转换添加到传递给printf的变量。