find -exec 명령 {} +에 대한 명령줄은 어떻게 작성됩니까?

find -exec 명령 {} +에 대한 명령줄은 어떻게 작성됩니까?

수동 설명이 find약간 불분명하다고 생각합니다.

"그러나 명령줄은 선택된 각 파일을 끝에 추가하여 작성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다."의 의미는 무엇입니까?

아래는 본문 내용입니다man find

-실행 명령 {} +

이 작업 변형은 -exec선택한 파일에 대해 지정된 명령을 실행하지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 작성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령줄은 xargs명령줄을 작성하는 것과 거의 동일한 방식으로 작성됩니다 . 명령 내에서는 '{}' 인스턴스가 하나만 허용됩니다. 명령은 시작 디렉터리에서 실행됩니다.

답변1

"그러나 명령줄은 선택된 각 파일을 끝에 추가하여 작성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다."의 의미는 무엇입니까?

몇 가지 샘플 파일을 만들어 보겠습니다.

touch {1..5}.txt

먼저 find 명령을 실행해 보겠습니다.

$ find . -exec echo my files are: {} +
my files are: . ./1.txt ./5.txt ./4.txt ./3.txt ./2.txt

보시다시피 은 발견된 {}모든 파일의 목록으로 대체됩니다 find. 이 예에서는 일치하는 파일이 6개 있지만 echo한 번만 실행됩니다.

쉘에는 단일 명령줄에 허용되는 문자 수에 제한이 있습니다. find이를 알고 하나의 명령줄에 넣을 파일이 너무 많으면 모든 파일 이름이 처리될 때까지 다른 파일로 여러 번 find실행됩니다 . echo이것이 "명령 호출 횟수가 일치하는 파일 수보다 훨씬 적은" 이유입니다.

디렉토리에 많은 파일을 생성하여 이를 테스트해 보겠습니다.

touch this_is_a_long_file_name{1..10000}.txt

이제 find 명령을 실행해 보겠습니다.

$ find . -exec bash -c 'echo $# files on this command line' _ {} +
3756 files on this command line
3754 files on this command line
2491 files on this command line

보시다시피 이 디렉터리에는 10,000개가 넘는 파일이 있음에도 불구하고 exec 명령은 세 번만 실행되었습니다.

관련 정보