
다음 파일을 고려하십시오.
$ 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
- 실제로 쉘이
test[1-4]
호출되기 전에 확장 중입니다find
. 당신은 그것을 탈출해야합니다'…'
{}
별도의 토큰인 경우에만 패턴으로 처리됩니다.
-exec
그 자체는 일반적으로 비용이 많이 들기 때문에 후행과 함께 사용하거나 +
피딩을 선호하여 사용하는 것이 좋습니다 xargs
.
이와 같은 for 루프를 사용할 수 있다는 것을 알고 있지만 한 번의 find 호출로 수행할 수 있는지 궁금합니다.
find findtest -name 'test[1-4]' -print0 | xargs -0I{} -- md5sum '{}/start.ksh'
— 효율적으로 실행 md5sum
— 모든 파일 이름이 한 번에 지정됩니다.