-execdir이 포함된 명령을 찾아 플래그를 읽지 못합니까?

-execdir이 포함된 명령을 찾아 플래그를 읽지 못합니까?

현재 디렉터리와 하위 디렉터리에서 모든 .jpg 이미지 파일을 찾아 다른 디렉터리로 이동하려고 합니다. 소스 파일이 대상 파일을 덮어쓸 것으로 예상했지만 이런 일은 발생하지 않았습니다. 명령을 실행하면 일부 파일에 대해 다음과 같은 출력이 표시됩니다(그러나 다른 파일은 이동되었습니다).

mv: cannot move './file' to '/destination': File exists

이것은 내가 사용하는 명령입니다:

find . -iname *jpg -execdir mv -f {} \;

-f(force) 옵션이 작동하지 않는 것 같나요?

돌아가서 mv -f ./source/file /dest단일 파일을 처리하면 올바르게 덮어쓰게 됩니다.

어떻게 되어가나요? 파일이 이동되지 않는 이유는 무엇입니까?


업데이트: 위에 나열된 명령은 실제로 통과한 명령이 아닙니다(수줍은 한숨). 실제 명령했다@Gilles의 이전 답변에서 제안한 대로 목적지를 포함하세요.

find . -iname '*jpg' -execdir mv -f {} /destination \;

/destination 디렉터리가 실제로 포함되었는지 확인하기 위해 이 명령을 다시 전달했는데 동일한 오류가 발생했습니다.

mv: cannot move './file' to '/destination': File exists

mv 명령에서 /destination 디렉토리를 사용할 때에도 이 오류가 표시되는 이유에 대한 가능한 답변이 있습니까?

답변1

실행 중이라고 주장하는 명령은 수신된 오류 메시지와 일치하지 않지만 어느 쪽이든 이 답변은 몇 가지 사항을 명확히 해야 합니다.

*jpg먼저, 현재 디렉터리에 일치하는 파일이 있으면 패턴은 *jpg에 포함됩니다 find. 이를 방지하려면 패턴을 인용해야 합니다.

당신이 준 명령을 사용하면 실행은 다음과 같습니다

cd directory && mv -f file

그러나 mv소스 파일과 대상이라는 두 가지 매개변수가 필요합니다.

대상 디렉터리를 전달해야 하며 를 사용하고 있으므로 대상 디렉터리는 파일이 -execdir포함된 각 디렉터리를 기준으로 .jpg해석됩니다 . 이 디렉터리가 있어야 합니다. .jpg모든 파일을 단일 디렉터리로 이동 하려면 먼저 디렉터리를 만든 다음 실행하세요.

find -iname '*.jpg' -execdir mv -f {} /common-destination-directory

모든 파일을 상대 경로로 이동하려면(예: images해당 위치에 상대적인 하위 디렉터리로 이동) 먼저 디렉터리를 만들어야 합니다.

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -f {} images \;

mvGNU 유틸리티(예: Linux)를 사용하면 디렉터리당 한 번만 실행하여 일부 최적화를 수행할 수 있습니다.

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -t images {} +

관련 정보