한 명령에서 다음 명령으로 인수 전달

한 명령에서 다음 명령으로 인수 전달

수동으로 실행하는 두 개의 별도 명령을 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)
    

bashPOSIX 셸이나 다른 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

관련 정보