2013-03-11 2 views
0

셸 명령으로 쉽게 해결할 수있는 흥미로운 문제가 있습니다. 디렉터리 이름이 의미있는 디렉터리 트리가 있고 각 디렉터리 안에는 .mp3 파일을 비롯한 여러 파일이 있습니다.디렉토리 이름과 일치하도록 파일 이름 바꾸기

모든 mp3 파일의 이름을 디렉토리 이름과 일괄 적으로 변경하고 싶습니다.

예 : 높은 수준의 디렉토리는 다음과 같습니다 : 각 하위 디렉토리의

Seans-iMac% ls 
2006.James Lovelock: Gaia’s Revenge 
2006.Religion and stem cell research 
2006.Stephen Schneider 
2006.Tony Judt: Post-war Europe since 1945 
2006.Water management 
2007.'Here, Bullet' 
2007.Alan Bennett 

내용은 예를 들어, 유사합니다

Seans-iMac% cd "2006.Religion and stem cell research" 
Seans-iMac% ls 
details.txt  lnl_20060605.mp3 synopsis.txt 

내가이로 변경하려면 :

Seans-iMac% ls 
details.txt  2006.Religion and stem cell research.mp3 synopsis.txt 

루프에 대해 을 시도했지만 얻을 수없는 것 같습니다. 매개 변수가 맞다. 좀 더 복잡하게 만들려면 디렉토리 이름에 공백이 있고 일부 디렉토리에는 작은 따옴표가 있어야합니다. 각 하위 디렉터리에서 최대 하나 개의 MP3 파일에서이 있는지 경우

+0

지금까지 코드로 질문을 업데이트하십시오. –

답변

3

이 그것을 수행해야합니다

for i in *; do mv "$i"/*.mp3 "$i/$i.mp3"; done 

참고 따옴표, 공백이 거래를.

+0

완벽한 - 작은 따옴표도 사용했습니다. – ardochhigh

2
for d in 2???.* 
do 
    mv "$d"/*.mp3 "$d/$d.mp3" 
done 

glob 패턴은 관심있는 디렉토리 이름을 생성하여 이름에 공백을 남겨 둡니다. mv 명령은 하위 디렉토리에 .mp3 파일이 하나만 있다고 가정하므로 첫 번째 인수는 올바른 파일 이름 (공백이 다시 보존 됨)으로 확장되고 두 번째 인수는 원하는 형식을 갖습니다. *.mp3은 큰 따옴표로 묶은 문자열 밖에 있습니다. 이것은 파일 이름 확장을 허용합니다. 공백을 잃지 않도록 디렉터리 이름 (공백을 포함 할 수 있음)은 항상 큰 따옴표 안에 들어 있습니다.

glob 이름 이외의 메커니즘을 사용하여 디렉토리 이름을 생성하는 것에주의하십시오. 그들은 사용할 수 없다는 것이 아닙니다. 바로 그 배려가 필요합니다. 줄 바꿈을 포함하는 디렉토리 이름은 공백보다 문제가 많습니다. 그런 디렉토리에 개행 문자를 포함하지 않도록 이름을 바꿀 것입니다 (개행 문자를 포함하는 파일 이름에도 동일하게 적용됩니다). 이름의 앞뒤 공백은 문제가 될 수 있습니다.

+0

Jonathan에게 아주 명확한 대답을 해주셔서 감사합니다. 그가 동일한 답변을했고 스택 오버플로 등급이 당신보다 훨씬 낮기 때문에 나는 그것을 jop에주었습니다. 자세한 설명에 감사드립니다. Sean – ardochhigh

2

저는 쉘로 tcsh를 사용하고 있다는 인상하에 있습니다. 저는 큰 전문가는 아니기 때문에 다음은 bash 셸을 생성하고 bash 구문을 사용합니다.

bash -c 'find /path/to/root/dir -name \*.mp3 | while read file; do d=`dirname "$file"`; b=`basename "$d"`; echo mv -v "$file" "$d/$b.mp3";done' 

이것은 수정하지 않으며 실행될 명령을 그대로 울립니다. 두 번 확인한 후 실제로 원하는 작업을 수행 한 경우 mv 명령 앞에있는 echo을 제거하십시오.

디렉토리에 mp3 파일이 두 개 이상 있으면 마지막 (알파벳순) 파일의 이름은 directory.mp3이되고 다른 모든 mp3 파일은 덮어 쓰기됩니다 (읽기 : 손실).

이 경우 폴더의 구조가 중첩 될 수 있으며 반드시 한 수준에 있지는 않습니다.

+0

프롬프트에서'%'에 기반한'csh'에 대한 흥미로운 관찰은 의심의 여지가 없습니다. 나는 'csh'가 유해하다고 생각하는 프로그램에 대한 FAQ (http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)에 대한 FAQ보다 더 신경 쓰지 않을 것이다. 대부분의 사람들은 C 쉘을 심각한 쉘 프로그래밍에 사용하지 않습니다. –

+0

zsh를 사용하고 있습니다. 이 기계는 새로운 빌드이며이 시점에서 기본값을 설치했습니다. – ardochhigh

관련 문제