폴더1에서 파일을 검색하고 폴더2에 파일이 없으면 스크립트를 실행합니다.

폴더1에서 파일을 검색하고 폴더2에 파일이 없으면 스크립트를 실행합니다.

folder1파일 만 .flv포함됩니다.

folder2파일 만 .mp4포함됩니다.

의 모든 파일에는 다음으로 끝나는 해당 파일이 .flv있어야 합니다 .folder1.mp4folder2

/folder1/123.flv그리고 /folder2/123.mp4.

.flv누락된 스크립트를 찾아 .mp4해당 스크립트를 생성하기 위해 mencoder를 실행하는 스크립트가 필요합니다 .mp4. 최선을 다해 이렇게 생각해 냈지만 여전히 IF THEN 문에 갇혀 있습니다.

for i in `find /folder1 -type f -iname '*.flv' -printf "%f\n" | 
    sed 's/.flv//g'` ; do 
    if [[ -n $(find /folder2/$i.mp4 -exec grep \-q 0 {} \;) ]] then
        /scripts/script.sh $i  fi ; done

Bash 스크립트는 다음과 같이 실행되어야 합니다:

/scripts/script.sh $i 

따라서 파일 이름에는 확장자가 없습니다.

답변1

이 시도:

find folder1 -type f -iname '*.flv' -exec bash -c \
    'f=${1#folder1/}; [ -f "folder2/${f%.flv}.mp4" ] || 
     scripts/script.sh "${1%.flv}"' none {} \;

이는 이름에 공백이나 기타 어려운 문자가 포함된 파일에 적용됩니다.

어떻게 작동하나요?

  • find folder1 -type f -iname '*.flv'

    flv 파일을 찾습니다.

  • -exec bash -c '...'

    발견된 각 flv 파일에 대해 이는 따옴표로 묶인 스크립트를 실행하는 bash를 실행하도록 find에 지시합니다(아래 참조).

  • f=${1#folder1/}

    f그러면 flv 파일 이름을 사용하지만 선행 디렉터리는 없는 변수가 생성됩니다 .

  • [ -f "folder2/${f%.flv}.mp4" ]

    해당 mp4 파일이 존재하는지 테스트합니다.

  • ||

    이는 이전 명령이 false를 반환하는 경우(즉, 해당 mp4 파일을 찾을 수 없는 경우)에만 bash에게 다음 명령을 실행하도록 지시합니다.

  • scripts/script.sh "${1%.flv}"'

    그러면 mp4 파일이 누락된 flv 파일에 대해 스크립트가 실행됩니다. 이 섹션은 제공된 파일 script.sh에서 제거되었습니다 .flv.

  • none {}

    none이는 bash 에게 문자열을 할당하고 $0(이 자리 표시자는 사용되지 않음) 에서 찾은 파일 이름 find( 으로 표시됨 {})을 쉘 변수에 할당하도록 지시합니다 $1.

  • \;

    이것은 find 명령의 끝을 표시합니다 -exec.

관련 정보