Solaris에서 구문 찾기를 이해하는 데 도움이 됩니다.

Solaris에서 구문 찾기를 이해하는 데 도움이 됩니다.

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

$ 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작업—모든 파일 이름을 한 번에 제공합니다.

관련 정보