다음 명령을 사용하여 30일이 지난 디렉토리, 파일 및 디렉토리를 지우고 아무도 파일을 돌려달라고 요청하지 않으면 몇 주 후에 삭제할 수 있는 아카이브 디렉토리로 이동합니다. 대상 디렉터리에는 사용자 이름별로 하위 디렉터리가 있으며 아카이브 디렉터리도 마찬가지입니다.
이것은 내가 사용하는 명령입니다:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
나는 Ask ubuntu에 대한 질문에 대답하기 위해 이것의 수정된 버전을 제안했고, 다른 사용자는 더 빠르고(그리고 더 정확합니까?) 줄 끝을 변경하도록 코드를 편집했습니다 \;
.+
여기를 보아라
그러나 명령 이 내가 사용하는 실제 명령에는 없지만 +
이런 방식으로 사용하면 작동합니다 . 시도하면 오류 메시지가 나타납니다.-exec
ls -lh
+
find: missing argument to '-exec'
왜 이런 식으로 동작하는지, 올바른 명령이 무엇인지 이해하지 못합니다. 명령 수정만 게시하지 말고, 맹목적으로 제안을 따르기보다는 이해하고 싶습니다.
답변1
해당 게시물의 사용자는 명령 +
끝에 있는 기호가 -exec
더 빠르다고 말할 수 있지만 그 이유는 아닙니다.
find
명령이 다음 파일을 반환한다고 가정합니다 .
/path/to/file1
/path/to/file2
/path/to/file3
일반 -exec
명령( -exec command {} \;
)은 일치하는 각 파일에 대해 한 번 실행됩니다. 예를 들어:
find ... -exec mv {} /target/ \;
실행:
mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/
+
기호( ) 를 사용하면 -exec command {} +
명령 끝에 일치하는 여러 파일을 추가하여 명령이 빌드됩니다. 예를 들어:
find ... -exec mv -t /target/ {} +
실행:
mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3
플래그를 올바르게 사용하려면 +
처리할 인수가 명령 중간이 아닌 명령 끝에 있어야 합니다. 그렇기 때문에 귀하의 예가 find
Trows입니다 . missing argument to '-exec'
마감을 놓쳤습니다 {}
.
답변2
사용자가 편집 내용을 설명했습니다....
...사용 중이 링크. 기본적으로 여러 명령을 사용하는 대신 모든 파일 이름을 하나의 명령 인스턴스로 보내 작업 속도를 높이는 것 같습니다. 다음은여기:
-exec를 세미콜론(
find . -exec ls '{}' \;
)과 함께 사용하면 실행됩니다.ls file1 ls file2 ls file3
그러나 대신 더하기 기호( )를 사용하면
find . -exec ls '{}' \+
모든 파일 이름이 단일 명령에 인수로 전달됩니다.ls file1 file2 file3
;
및를 사용하여 사용할 수 있는 다른 양식 +
도 있습니다 (여기:)
따라서 find 명령에는 다음 예제 구문이 허용됩니다.
find . -exec echo {} \; find . -exec echo {} ';' find . -exec echo {} ";" find . -exec echo {} \+ find . -exec echo {} +
그러나 옵션이나 이와 유사한 옵션을 사용 mv [OPTION]... SOURCE DEST
하지 않는 한 구문이 이기 때문에 이것이 move 명령에서 작동하는지 확신할 수 없습니다 . 그러나 여러 파일 이름이 제공되는 경우를 이해할 수 있으므로 추가 옵션 없이도 -t
작동해야 합니다 . 또한 이스케이프해야 할 수도 있습니다(예 ls
: )+
\+