수동으로 실행하는 두 개의 별도 명령을 cron을 실행할 수 있는 bash 스크립트로 통합하는 스크립트를 작성하려고 합니다.
첫 번째 명령은 특정 이름과 크기를 가진 파일을 간단히 검색하는 것입니다.
find /some/path -type f -name file.pl -size +10M
그러면 일치하는 여러 파일과 전체 경로가 생성됩니다. 그런 다음 이러한 경로를 다음 스크립트에 대한 인수로 for 루프에 수동으로 복사합니다.
for path in /some/path/1/file.pl /some/path/2/file.pl /some/path/3/file.pl ; do perl /my/script.pl $path ; done
이것을 단일 쉘 스크립트에 넣는 것이 쉬울 것 같지만 어렵습니다.
답변1
술어의 용도는 다음과 같습니다 -exec
.
find /some/path -type f -name file.pl -size +10M -exec perl /my/script.pl {} \;
정말로 갖고 싶다면너의 껍질의 출력을 기반으로 명령을 실행한 다음 신뢰성을 유지하려면 find
명령이 bash
다음과 같이 /특정이어야 합니다.zsh
zsh
:IFS=$'\0' for f ($(find /some/path -type f -name file.pl -size +10M -print0)) { /my/script.pl $f }
에서는
zsh
간단하게 다음을 수행할 수 있습니다.for f (./**/file.pl(.LM+10)) /my/script.pl $f
bash
/zsh
while IFS= read -rd '' -u3 file; do /my/script.pl "$file" done 3< <(find /some/path -type f -name file.pl -size +10M -print0)
bash
POSIX 셸이나 다른 POSIX 셸에서 수행하는 작업은 무엇이든 다음을 피하세요.
for file in $(find...)
또는 최소한 필드 구분 기호를 줄 바꿈으로 수정하고 와일드카드를 비활성화하여 문제를 완화하십시오.
IFS='
'; set -f; for file in $(find...)
(개행 문자가 포함된 파일 경로에서는 여전히 실패합니다.)
답변2
GNU 도구를 사용하는 경우 다음도 작동합니다.
find /some/path -type f -name file.pl -size +10M -print0 | xargs -0 -n 1 -r perl /my/script.pl
설명하다:
- 이 옵션을 사용
-print0
하면 GNU find는 바이트를 사용하여 파일 이름을 구분합니다\0
.\0
바이트는 파일 이름의 일부가 될 수 없으므로 파일 이름을 고유하게 구분합니다 . - 이 옵션은 GNU xargs가 표준 입력을 --구분된 파일 이름 목록
-0
으로 읽도록 지시합니다 .\0
- 이 옵션은
-n 1
하나 이상의 파일 이름이 스크립트에 전달되도록 강제합니다(스크립트가 전체 파일 목록을 인수로 처리할 수 있는 경우 이를 무시하십시오). - 마지막으로,
-r
파일 이름이 제공되지 않으면 프로그램이 실행되지 않도록 하는 또 다른 GNU 확장이 있습니다.
답변3
이것은 트릭을 수행해야합니다
for path in `find /some/path -type f -name file.pl -size +10M`; do perl /my/script.pl $path ;done