올바른 찾기 -exec 구문은 무엇입니까


10

특정 폴더 내에서 2MB보다 큰 파일을 삭제하고 싶었습니다. 그래서 나는 달렸다.

find . -size +2M

그리고 나는 두 파일의 목록을 얻었다

./a/b/c/file1

./a/f/g/file2

그래서 나는 다음을 실행합니다.

find . -size +2M -exec rm ;

오류 메시지가 나타납니다 Find: missing argument to -exec

맨 페이지에서 구문을 확인하면 -exec command ;

대신에 나는 시도

find . -size +2M -exec rm {} +

그리고 작동합니다. {}이 (가) rm file1 file2대신 명령을 실행한다는 것을 이해합니다 rm file1; rm file2;.

왜 첫 번째가 효과가 없었습니까?

대답:

나는 그것이 무슨 말을했는지 마침내 이해하기 위해 RTFM을 두 번해야했다고 생각합니다. 첫 번째 예에 {}가 표시되지 않더라도 모든 경우에 중괄호가 필요합니다. 그런 다음 \를 추가하십시오. 또는 원하는 방법에 따라 + 제목 만 읽지 마십시오. 설명도 읽으십시오. 알았다.

답변:


16

다음 형식 중 하나를 사용할 수 있습니다.

find . -size +2M -exec rm {} +

find . -size +2M -exec rm {} \;

세미콜론은 탈출해야합니다!


10
-exec rm {} \;

당신은 사용할 수 있습니다 .. 남자 찾기

-exec command ;
              Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the  command  until
              an  argument  consisting of `;' is encountered.  The string `{}' is replaced by the current file name being processed everywhere
              it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.  Both of  these
              constructions  might  need  to  be escaped (with a `\') or quoted to protect them from expansion by the shell.  See the EXAMPLES
              section for examples of the use of the -exec option.  The specified command is run once for each matched file.  The  command  is
              executed  in  the  starting directory.   There are unavoidable security problems surrounding use of the -exec action; you should
              use the -execdir option instead.

       -exec command {} +
              This variant of the -exec action runs the specified command on the selected files, but the command line is  built  by  appending
              each  selected file name at the end; the total number of invocations of the command will be much less than the number of matched
              files.  The command line is built in much the same way that xargs builds its command  lines.   Only  one  instance  of  `{}'  is
              allowed within the command.  The command is executed in the starting directory.

1
그래. 나는 그것이 무슨 말을했는지 마침내 이해하기 위해 RTFM을 두 번해야했다고 생각합니다. 첫 번째 예에 {}가 표시되지 않더라도 모든 경우에 중괄호가 필요합니다. 그런 다음 \를 추가하십시오. 또는 원하는 방법에 따라 + 알았다.
Safado

2

효율성을 위해 일반적으로 xargs를 사용하는 것이 좋습니다.

$ find /path/to/files -size +2M -print0 | xargs -0 rm

1
실제로는 아닙니다. Greg의 위키에있는 Guide 항목에서 다음과 같이 말합니다. -exec 조치의 끝에있는 + (; 대신;)는 find에 내부 xargs와 유사한 기능을 사용하도록 지시합니다.이 기능을 사용하면 모든 파일 청크에 대해 rm 명령이 한 번만 호출됩니다. 파일 당 한 번 대신.
adaptor

아, 흥미 롭습니다. 나는 수년 동안 find + xargs를 사용해 왔으며 + 연산자에 대해 전혀 몰랐습니다. 지적 해 주셔서 감사합니다!
EEAA

Greg의 위키를 진심으로 추천 할 수 있습니다. 이 사람은 내가 배우고 싶었던 것보다 배쉬와 GNU 툴셋에 대해 더 많이 알고있다. 그 전에 몇 년 동안보다 읽기를 시작한 이후 bash 사용에 대해 더 많이 배웠다고 말하는 것이 안전합니다.
adaptor

2
Greg는 누구이며 위키를 어디에서 찾을 수 있습니까?
Safado

: 나는이 하나라고 생각 @Safado mywiki.wooledge.org
엔리코 Stahn

0

나는 이것을 위해 -exec를 전혀 사용하지 않을 것이다. find는 파일 자체를 제거 할 수도 있습니다.

find . -size +2M -delete

(이것은 아마도 GNUism 일 것입니다, 당신이 non-gnu find에서 이것을 찾을 지 모르겠습니다)


이것 뒤에 이유가 있습니까, 아니면 단순히 개인적인 취향입니까?
Safado

unlink (2) 자체를 호출하고 삭제를 위해 새 프로세스를 분기 할 필요가 없습니다. 훨씬 더 효율적입니다. 또한 훨씬 더 읽기 쉽습니다.
스튜

0

문서화 한대로 -exec에는 find 출력의 자리 표시 자로 {}이 필요합니다.

bash 및 GNU 도구 사용을위한 확실한 안내서는 다음같습니다.

보시다시피, 예제로 사용한 두 번째 명령을 명시 적으로 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.