파일을 찾아 -exec를 사용하여 다른 폴더로 이동하세요.

파일을 찾아 -exec를 사용하여 다른 폴더로 이동하세요.

파일을 찾아 다른 폴더로 이동해 보았습니다.

$ find ~ -iregex ".*cheat.*\.pdf" -exec mv "{}" cheatSheet +
find: missing argument to `-exec'

그러나 테스트는 작동합니다.

find ~ -iregex ".*cheat.*\.pdf" -exec echo {} +

내 사용법에 문제가 있나요?

답변1

를 사용하는 경우 -exec ... {} +{}, 바로 앞에 와야 합니다 +.

이는 당신이 사용해야 함을 의미합니다

-exec mv -t cheatSheet {} +

이를 위해서는 GNU에 대한 액세스가 필요합니다 mv. GNU가 없으면 mv다음을 사용합니다.

-exec mv {} cheatSheat \;

한 번에 하나의 파일을 이동하거나

-exec sh -c 'mv "$@" cheatSheet' sh {} +

인라인 스크립트를 호출하여 모든 파일을 한 번에 이동합니다.

너도 그렇지 않아 -iregex. 다음 내용을 읽고 이해하기가 더 쉽습니다.

find "$HOME" -ipath '*cheat*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

또는 명확성을 위해 다음 중 하나가 실제로 의미하는 바입니다(귀하가 cheat해당 그룹의 일부가 되기를 원하는지 여부에 따라 다름).파일 이름경로 끝(첫 번째 선택) 또는 다음 중 하나디렉토리 이름경로(두 번째 옵션)):

find "$HOME" -iname '*cheat*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

find "$HOME" -ipath '*cheat*/*' -iname '*.pdf' \
    -exec sh -c 'mv "$@" cheatSheet' sh {} +

이는 -ipathGNU find확장이지만 -iname표준은 아니지만 보다 일반적인 구현입니다.

또한 이름 충돌이 발생하여 파일 이름이 정확히 동일한 경우 다른 파일을 이동하는 과정에서 이동된 파일 중 일부를 덮어쓰게 된다는 점도 주목할 가치가 있습니다. GNU를 사용하면 옵션(기존 파일을 삭제하지 않음) 또는 옵션(기존 파일 이름 바꾸기/백업)을 mv사용하여 이를 방지할 수 있습니다 .-n-b

관련된:

답변2

필수는 {}명령의 끝입니다 -exec. 이 명령은 다음 옵션을 사용하여 mv이 작업을 지원합니다 .-t

mv [OPTION]... -t DIRECTORY SOURCE...

따라서 귀하의 명령은 다음과 같습니다

find ~ -iregex ".*cheat.*\.pdf" -exec mv -t cheatSheet "{}" +

관련 정보