find -exec에서 출력을 파이프하고 리디렉션하기 위한 올바른 위치는 무엇입니까?

find -exec에서 출력을 파이프하고 리디렉션하기 위한 올바른 위치는 무엇입니까?

FreeBSD 의 콘솔에서 find옵션 -exec(예: find . -exec sha1 {} \;)을 사용하고 있습니다.

  1. > >> 및 &와 같이 exec 명령이나 find 명령에 구문적으로 적용되는 리디렉션 및 기타 실행 제어 기호를 올바르게 배치하려면 어떻게 해야 할까요? | 다른 경우 find나 명령이 있나요?exec

  2. 동일한 주제에서, tee콘솔에서 view-exec 명령의 출력을 사용하고(진행 상황을 관찰하기 위해) 파일에 추가하려면(나중에 사용하기 위해) 구문은 무엇입니까?

(쉘이 다양하다는 것을 알고 있지만 가장 일반적으로 사용되는 쉘(예: sh/csh)은 매우 유사할 것으로 예상합니까?)

고쳐 쓰다:

find -exec어느 시점에서는 스크립팅 없이 간단한 명령으로 중첩을 수행할 수 있는지 알고 싶습니다 . 문제를 일으키는 사용 사례는 다음과 같습니다.

  • 외부 find: DIR_MATCH_TEXT와 일치하는 모든 하위 디렉터리를 찾습니다.DIR1
  • inside find: 외부 루프(DIR2라고 함)에서 발견된 일치하는 각 하위 디렉터리에 대해 다음 명령을 실행합니다.
    find DIR2 -name "FILE_MATCH_TEXT" -exec sha1 {} \; >> DIR1/DIR2_hashes.txt

find -exec목적은 해당 하위 디렉터리에 대한 일부 작업의 출력을 포함하는 일치하는 하위 디렉터리에 각각 해당하는 파일 집합을 만드는 것입니다 .

즉, 및 를 /backups포함 하면 결과는 에 있는 모든 .pdf 파일의 출력 과 에 있는 모든 .pdf 파일의 출력을 포함 하는 두 개의 파일이 된다는 것입니다 ./jan2017/feb2017/backups/jan2017_hashes.txt/backups/feb2017_hashes.txtjan2017_hashes.txtsha1/backups/jan2017feb2017_hashes.txtsha1/backups/feb2017

지금까지의 답변을 보면 ?에 대한 인수 find로 쉘을 사용하여 외부를 호출해야 한다고 생각합니다.-exec

답변1

I/O 리디렉션 및 파이프는 bash와 같은 셸의 기능입니다. find명령의 소스 코드 보기 (https://www.gnu.org/software/findutils/), 이 -exec옵션은 주어진 명령을 직접 분기하고 실행하며, 쉘을 통해 전송하지 않습니다. 따라서 .without help 매개변수에 파이프와 리디렉션을 포함할 수 없습니다 find.

그러나 find쉘을 호출하고 쉘이 차례로 명령을 호출하도록 할 수 있습니다. 셸을 통해 동일한 작업을 실행하면 셸에서 제공하는 I/O 리디렉션 작업에 액세스할 수 있습니다. 예를 들어 다음을 고려하십시오.

find . -type f -exec bash -c 'ls -l "$1" >> /tmp/result' find-sh {} \;

ls -l에서 찾은 각 파일 (이 컨텍스트에서 셸은 파일을 참조함) 에서 실행되고 출력을 로 리디렉션합니다. 여기서는 find가 각 파일에 대해 쉘을 호출하므로 각 결과가 이전 결과를 덮어쓰게 되어 마지막 명령의 출력만 포함된 파일이 생성됩니다.find$0/tmp/result>>>>

파이프도 작동하지만 "파일당 하나의 실행자"라는 동일한 경고가 있습니다.

find . -type f -exec bash -c 'ls -l "$1" | grep something' find-sh {} \;

그럼에도 불구하고 의 컨텍스트에서 리디렉션을 적용하는 이유나 -execfind 자체의 출력에 대한 리디렉션을 수행하면 무엇을 얻을 수 있는지 명확하지 않습니다.

관련 정보