2013-11-26 197 views
1

我有一个bash脚本,它不会产生我期望的结果。它旨在重命名文件夹结构中的文件,以便文件可以在文件夹结构之外排序。重命名文件夹名称中的文件引起的Bash脚本问题

文件结构从包含10-20张CD光盘的典型音频书中撕掉。最上面的文件夹是保存文件夹的每个盘,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 "[email protected]" 


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但他们不是。我错过了什么?

这里的任何帮助,非常感谢。

// Johan

+1

从''man 1 bash'':“带有前导0的常量被解释为八进制数字。”我猜想从文件名匹配的字符串包括前导零。 例如''为我在{0..9}中;做printf“%d \ n”“0 $ {i}”;完成'' –

+0

这是一个重复? http://stackoverflow.com/questions/8078167/bizarre-issue-with-printf-in-bash-script09-and-08-are-invalid-numbers-07 –

回答

2

重新格式化并修复。

cd "[email protected]" 
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的变量中。

+1

我跟着你建议作为一个dup的链接,并在那里了解到我可以将var作为float(%03.f而不是%03d)来处理,从而避免将其视为八进制数。它像一个魅力。感谢您的帮助! – Nordanfors

相关问题