Solaris의 `find` 구문을 이해하는 데 도움이 됩니다.

Solaris의 `find` 구문을 이해하는 데 도움이 됩니다.

다음 파일을 고려하십시오.

$ find findtest                     
findtest
findtest/test1
findtest/test1/start.ksh
findtest/test2
findtest/test2/start.ksh
findtest/test3
findtest/test3/start.ksh
findtest/test4
findtest/test4/start.ksh

{}내 질문은 통화 중 사용에 관한 것입니다 -exec. 결과 파일을 지정할 때 예상한 대로 작동합니다.

$ find findtest -name test[1-4] -exec ls -d {} \;           
findtest/test1
findtest/test2
findtest/test3
findtest/test4

그러나 경로에서 사용될 때 확장되지 않는 것 같습니다.

$ find findtest -name test[1-4] -exec md5sum {}/start.ksh \;     
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory
md5sum: {}/start.ksh: No such file or directory

find -type d -exec하위 계층 파일에 액세스하려면 어떻게 해야 합니까 ? 이와 같은 루프 를 사용할 수 있다는 것을 알고 있지만 한 번의 호출 for로 수행할 수 있는지 궁금합니다 .find

$ for f in $(find findtest -name test[1-4]); do md5sum "$f"/start.ksh; done
d41d8cd98f00b204e9800998ecf8427e  findtest/test1/start.ksh
d41d8cd98f00b204e9800998ecf8427e  findtest/test2/start.ksh
d41d8cd98f00b204e9800998ecf8427e  findtest/test3/start.ksh
d41d8cd98f00b204e9800998ecf8427e  findtest/test4/start.ksh

답변1

그만큼find 명령에 대한 POSIX 표준분리된 {}만 파일 이름으로 대체하고 첫 번째 파일만 대체하도록 요구합니다. {}/start.ksh불특정 행동에 납을 사용하는 것 .

두 문자 "{}"만 포함하는 인수는 집계된 경로 이름 세트로 대체되며, 각 경로 이름은 집계된 순서와 동일한 순서로 호출된 유틸리티에 별도의 인수로 전달됩니다. 두 개 이상의 경로 이름 집합의 크기는 유틸리티 실행으로 인해 시스템의 {ARG_MAX} 제한이 초과되지 않도록 제한되어야 합니다. 두 문자 "{}"만 포함하는 인수가 두 개 이상 있으면 동작이 지정되지 않습니다.

Utility_name 또는 인수 문자열에 "{}" 두 문자가 포함되어 있지만 "{}" 두 문자만 포함되어 있지 않은 경우 find가 해당 두 문자를 대체할지 아니면 변경 없이 문자열을 사용할지는 구현에 따라 정의됩니다.

Solaris find로 원하는 작업을 수행하는 한 가지 방법은 다음 명령입니다.

find findtest -name "test[1-4]" -exec sh -c 'md5sum $1/start.ksh' foo {} \;

더 빠른 방법은 다음과 같습니다.

find findtest -name "test[1-4]" -exec sh -c 'for i; do md5sum "$i/start.ksh"; done' foo {} + 

답변2

  1. 실제로 쉘이 test[1-4]호출되기 전에 확장 중입니다 find. 당신은 그것을 탈출해야합니다'…'
  2. {}별도의 토큰인 경우에만 패턴으로 처리됩니다.

-exec그 자체는 일반적으로 비용이 많이 들기 때문에 후행과 함께 사용하거나 +피딩을 선호하여 사용하는 것이 좋습니다 xargs.

이와 같은 for 루프를 사용할 수 있다는 것을 알고 있지만 한 번의 find 호출로 수행할 수 있는지 궁금합니다.

find findtest -name 'test[1-4]' -print0 | xargs -0I{} -- md5sum '{}/start.ksh'— 효율적으로 실행 md5sum— 모든 파일 이름이 한 번에 지정됩니다.

관련 정보