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