파일을 찾아 다른 폴더로 이동해 보았습니다.
$ 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 {} +
이는 -ipath
GNU find
확장이지만 -iname
표준은 아니지만 보다 일반적인 구현입니다.
또한 이름 충돌이 발생하여 파일 이름이 정확히 동일한 경우 다른 파일을 이동하는 과정에서 이동된 파일 중 일부를 덮어쓰게 된다는 점도 주목할 가치가 있습니다. GNU를 사용하면 옵션(기존 파일을 삭제하지 않음) 또는 옵션(기존 파일 이름 바꾸기/백업)을 mv
사용하여 이를 방지할 수 있습니다 .-n
-b
관련된:
답변2
필수는 {}
명령의 끝입니다 -exec
. 이 명령은 다음 옵션을 사용하여 mv
이 작업을 지원합니다 .-t
mv [OPTION]... -t DIRECTORY SOURCE...
따라서 귀하의 명령은 다음과 같습니다
find ~ -iregex ".*cheat.*\.pdf" -exec mv -t cheatSheet "{}" +