2013-06-13 4 views
0

토런트 명명 규칙에 따라 읽기 쉬운 거대한 미디어 파일 저장소가 있습니다. 한순간에 필자는 해당 파일이 들어있는 폴더의 이름을 올바르게 지정했지만 bash 스크립트를 사용하여 모든 .avi, .mkv 등의 파일을 기본 미디어 디렉토리에 덤프하지는 않습니다.확장명을 유지하면서 폴더 내의 파일 이름을 폴더 이름으로 바꿉니다.

개요 : 현재 디렉토리 트리 :

Proper Movie Title/ 
->Proper.Movie.Title.2013.avi 
->Proper.Movie.Title.2013.srt 
Title 2/ 
->Title2[proper].mkv 
Movie- Epilogue/ 
->MOVIE EPILOGUE .AVI 
Media Movie/ 
->MEDIAMOVIE.CD1.mkv 
->MEDIAMOVIE.CD2.mkv 

. . .

원하는 디렉토리 트리 :이 비록

Proper Movie Title/ 
->Proper Movie Title.avi 
->Proper Movie Title.srt 
Title 2.mkv 
Movie- Epilogue.avi 
Media Movie/ 
->Media Movie.cd1.mkv 
->Media Movie.cd2.mkv 

이상적인 것, 내 주요 소원은 해당 파일 이름을 변경하고 상위 디렉토리로 이동해야하는 내 단 하나의 동영상 파일과 디렉토리입니다.

현재 나의 접근 방식은 .sh 파일에서 이중 for 루프를 사용하는 것이지만, 현재 내 머리 속에 새로운 bash 지식을 유지하는 데 어려움을 겪고 있습니다.

도움을 받으실 수 있습니다.

내 현재 코드 (단지 내부 동영상 파일에 대한 액세스 권한을 얻을 수 있습니다) :

find * -type f -maxdepth 1 | while read file 
do 
    dirname="$(dirname "$file")" 
    new_name="${dirname##*/}" 
    file_ext=${file##*.} 
    if [ -n "$file_ext" -a -n "$dirname" -a -n "$new_name" ] 
    then 
     echo "mv '$file' '$dirname/$new_name.$file_ext'" 
    fi 
done 

find *는 모든 항목에서 찾을 실행 말한다 :

여기
#!/bin/bash 
FILES=./* 
for f in $FILES 
do 
     if [[ -d $f ]]; then 
       INFILES=$f/* 
       for file in $INFILES 
       do 
         echo "Processing >$file< folder..." 
       done 
     #cat $f 
     fi 
done 
+1

빠른 해결책은 불법 복제를 방지하는 것입니다! 영화를 구입하면 적절한 제목을 갖게됩니다. –

+0

당신이 시도한 것을 보여주십시오, 우리는 당신을 위해 당신의 코드를 작성하지 않았습니다. – Barmar

+0

내가 생각하고있는 코드가 추가되었습니다. – SWPhantom

답변

3

은 간단 뭔가 현재 디렉토리. -type f은 파일에만 관심이 있다고 말하고 -maxdepth 1은 검색의 깊이를 즉각적인 디렉토리로 제한합니다.

  • ${file##*.}

    패턴 일치를 사용하고 있습니다. ##은 가장 큰 왼손 일치가 *.이라고 말합니다. 기본적으로 모든 것이 파일 확장자로 연결됩니다.
  • file_dir="$(dirname "$file")"은 디렉토리 이름을 가져옵니다.
  • 어디서나 인용문을 적어주세요! 공백에주의해야합니다.

그런데 실제 이동 대신 echo이 사용됩니다. 출력을 파일로 파이프 처리하고 파일을 검사 한 다음 모든 내용이 정상적으로 보이는지 확인한 다음 해당 파일을 쉘 스크립트로 실행합니다.

+0

이것은 대단합니다, David. 고마워. 디렉토리 내에 얼마나 많은 파일이 있는지 감지하는 확실한 방법이 있습니까? "| wc"명령은 파일 수를 리턴하지 않고 디렉토리 내의 단어 수를 리턴합니다. 디렉터리에 <= 2 파일이있는 경우 주어진 코드 만 실행하는 조건부를 갖고 싶습니다. – SWPhantom

+0

@SWPhantom'wc -l' 명령은 단어가 아닌 _lines_를 반환합니다. 다양한 옵션들에 대해서는'man wc'을 보라. –

관련 문제