수동 설명이 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 명령은 세 번만 실행되었습니다.