find -exec mv가 첫 번째 실행 후 중지됨

find -exec mv가 첫 번째 실행 후 중지됨

이 문제를 조사하는 동안:파일 유형 및 날짜를 ​​기준으로 디렉토리 찾기 및 이동, 나는 내 자신의 문제를 우연히 발견했습니다.

먼저, 파일이 포함된 여러 디렉터리를 만들었습니다.

seq 10 | while read dir; do
  mkdir dir$dir
  touch dir$dir/file.txt
  seq 5 | while read file; do
    touch dir$dir/file${dir}_$file
  done
done

그런 다음 다음 find 명령을 시도했습니다.

$ find -type f -name "*.txt"
./dir6/file.txt
./dir8/file.txt
./dir10/file.txt
...

예상대로 작동합니다.

다음이 있습니다 -exec:

$ find -type f -name "*.txt" -exec sh -c 'echo mv -v "${0%/*}" ../bar' {} \;
mv -v ./dir6 ../bar
mv -v ./dir8 ../bar
mv -v ./dir10 ../bar
...

예상대로 작동합니다.

이제 실제 명령은 다음과 같습니다.

$ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;
`./dir6' -> `../bar/dir6'

첫 번째 이후에 중지됩니다 mv. 오류 메시지가 없습니다. 종료 상태는 0입니다. 디렉토리가 bar존재하며 dir6올바르게 이동되었습니다.

다시 실행하면 이런 일이 발생합니다.

$ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;
`./dir8' -> `../bar/dir8'

첫 번째 이후에 다시 중지하십시오 mv. 종료 상태는 0입니다. dir8올바르게 이동되었습니다.

find첫 번째 이후에 왜 멈췄나요 mv? 디렉토리가 이동되었기 때문에 find혼란스럽습니까 ? 왜 오류를 인쇄하지 않거나 오류 종료 상태를 반환하지 않습니까?

더 많은 디렉토리와 더 많은 파일을 생성하면 동일한 동작이 발생합니다.

위에 링크된 질문에서 문제는 find문제 없이 한 번 실행되지만 그 이후의 모든 일치 항목은 오류를 인쇄한다는 것입니다. 그게 그렇게 중요한 건가?

사용 find (GNU findutils) 4.4.2.

답변1

존재하다:

find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;

find현재 디렉터리( .)를 열고 내용( list1)을 가져옵니다. 그런 다음 목록 작업을 계속하십시오. 파일 이 dir6디렉터리이므로 ; 디렉터리로 이동하여 파일을 열고 두 번째 파일 목록( list2)을 가져와서 처리 file.txt하고 다음을 수행합니다.

mv -v ./dir6 ../bar

이제 find현재 디렉토리는 변경되지 않았지만 경로는 다음과 같습니다. 이제 입니다 ../bar/dir6. 내용을 순회한 후 dir6( )로 돌아와 chdir("..")현재 에 있습니다 ../bar.find감지된 디렉터리가 이전과 달라서 종료되었습니다..

관련 정보