-exec에 누락된 인수는 무엇입니까?

-exec에 누락된 인수는 무엇입니까?

다음 명령을 사용하여 30일이 지난 디렉토리, 파일 및 디렉토리를 지우고 아무도 파일을 돌려달라고 요청하지 않으면 몇 주 후에 삭제할 수 있는 아카이브 디렉토리로 이동합니다. 대상 디렉터리에는 사용자 이름별로 하위 디렉터리가 있으며 아카이브 디렉터리도 마찬가지입니다.

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

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

나는 Ask ubuntu에 대한 질문에 대답하기 위해 이것의 수정된 버전을 제안했고, 다른 사용자는 더 빠르고(그리고 더 정확합니까?) 줄 끝을 변경하도록 코드를 편집했습니다 \;.+여기를 보아라

그러나 명령 이 내가 사용하는 실제 명령에는 없지만 +이런 방식으로 사용하면 작동합니다 . 시도하면 오류 메시지가 나타납니다.-execls -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

플래그를 올바르게 사용하려면 +처리할 인수가 명령 중간이 아닌 명령 끝에 있어야 합니다. 그렇기 때문에 귀하의 예가 findTrows입니다 . missing argument to '-exec'마감을 놓쳤습니다 {}.

답변2

사용자가 편집 내용을 설명했습니다....

'+' exec의 종결자가 '\;'보다 빠릅니다. https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command를 참조하세요. 원본 파일에서 백업 파일을 만드는 것이 좋습니다

...사용 중이 링크. 기본적으로 여러 명령을 사용하는 대신 모든 파일 이름을 하나의 명령 인스턴스로 보내 작업 속도를 높이는 것 같습니다. 다음은여기:

-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: )+\+

관련 정보