이 문제를 조사하는 동안:파일 유형 및 날짜를 기준으로 디렉토리 찾기 및 이동, 나는 내 자신의 문제를 우연히 발견했습니다.
먼저, 파일이 포함된 여러 디렉터리를 만들었습니다.
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
감지된 디렉터리가 이전과 달라서 종료되었습니다..