-exec에 대한 누락 된 주장은 무엇입니까?


15

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

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

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

내가 우분투를 물어의 질문에 대답이의 수정 된 버전을 제안, 다른 사용자가 행의 끝을 변경할 수있는 코드 편집 \;을 위해 +이 빠르다로 (더 정확한을?). 여길 봐

그러나 명령이 있지만 실제로 사용 +하는 -exec명령이 ls -lh아닌 경우이 방법으로 사용 하면 작동합니다 . 내가 시도 +하면 오류 메시지가 나타납니다.

find: missing argument to '-exec'

왜 이런 식으로 작동하는지 또는 올바른 명령이 무엇인지 이해하지 못합니다. 그냥 명령 수정을 게시하지 말고 맹목적으로 제안을 따르는 것이 아니라 이해하고 싶습니다.


이 답변 을 언급하고 있습니까? 이것은 이유를 설명 할 수 있습니다
Wilf

감사합니다 @Wilf 업데이트가 발생한 답변을 보여주기 위해 업데이트되었습니다. 귀하가 제공 한 링크에는 뇌가 대처할 수있는 방식으로 설명하는 추가 링크가 있습니다.
Arronical


화려하게 주기적으로 @souravc에게 감사드립니다. 그 질문은 내 명령을 편집 한 사용자에 의한 것입니다! 마지막으로 +동일한 명령에 여러 인수를 제공하지만 그에 mv대처할 수는 없습니다!
Arronical

@Arronical mv can, 내 대답을 볼 수 있습니다 ^
chaos

답변:


19

해당 게시물의 사용자 +-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찬성 missing argument to '-exec'입니다. 그것은 결산을 그리워한다 {}.


와 함께 사용될 때 왜 마지막 인수 find -exec가 필요한지 항상 궁금 {}했습니다 +. OP의 명령 줄과 같은 구성 요소를 작동시키는 대신 디자인 결정이 내려진 이유를 아는 사람이 있습니까?
Peter Cordes

11

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

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

... 이 링크를 사용 합니다 . 기본적으로 여러 명령을 사용하는 대신 모든 파일 이름을 하나의 명령 인스턴스로 보내 속도를 높입니다. 여기 예가 있습니다 :

세미콜론 ( find . -exec ls '{}' \;) 과 함께 -exec를 사용하면

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여러 파일 이름이 제공되는 경우 이해할 수 있으므로 추가 옵션이 없어도 작동 합니다. 는 +또한 이스케이프 할 필요가 있습니다 (예 \+)


둘 다 큰 대답이지만, 조금 더 빠르며 mv -t+1이지만 설명하기 때문에 혼란에 빠져야합니다!
Arronical
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.