2013-11-26 3 views
1

예상 한 결과를 생성하지 못하는 bash 스크립트가 있습니다. 파일이 폴더 구조 외부에서 정렬 될 수 있도록 폴더 구조의 파일 이름을 바꿉니다.폴더 이름에서 파일 이름을 바꾸는 Bash 스크립트 문제

파일 구조는 10-20 개의 CD 디스크가 들어있는 일반적인 오디오 북에서 추출됩니다.

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... 

스크립트 폴더 이름을 사용하여 파일의 이름을 바꿀 수는 다음과 같습니다 : 최상위 폴더는 02, 01, 각 디스크의 폴더를 보유 제목 폴더, 이와 같이 03 등

입니다

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의 이름을 바꿀 때 이상한 일이 발생한다는 것입니다. 왜 그런 일이 발생하는지 알 수 없습니다.

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 그들이 어떻게 이름이 변경됩니다 여기

는 실행 (rename_log.out)의 출력 로그 파일입니다. 나는 그들에게 01008 & 01009가 될 것이라고 기대하지만 그들은 그렇지 않다. 나는 무엇을 놓치고 있는가 ???

여기에 도움을 주시면 감사하겠습니다.

// 요한

+1

''man 1 bash'' : "0을 선두로하는 상수는 8 진수로 해석됩니다."파일 이름과 일치하는 문자열에는 앞에 오는 0이 포함됩니다. 예. ''나는 {0..9}에 속해있다. do printf "% d \ n" "0 $ {i}"; done'' –

+0

이것의 dup? 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 (% 03d 대신 % 03d)로 처리 할 수 ​​있으므로 8 진수로 취급되지 않습니다. 그것은 매력처럼 작동합니다. 도와 줘서 고마워! – Nordanfors