하위 디렉터리를 반복하고 각 하위 디렉터리에서 Perl 스크립트를 실행합니다.

하위 디렉터리를 반복하고 각 하위 디렉터리에서 Perl 스크립트를 실행합니다.

아래와 같이 여러 하위 디렉터리가 있는 상위 디렉터리가 있습니다.

Parent_directory
    subdirectory_1
        perlscript.pl 
        file.fasta
    subdirectory_2
        perlscript.pl 
        file_2.fasta

모든 하위 디렉토리에서 Perl scipt를 실행하고 싶습니다. 다음 명령을 사용하려고 합니다

find . -type d | while read d; do perl hoz-3-v1c.pl $d/* ; done

하지만 출력은 상위 디렉터리로 전달되므로 각 하위 디렉터리에 출력을 원합니다.

답변1

find이런 경우에는 전혀 고민할 필요가 없을 것 같습니다.

for dirpath in Parent_directory/*/; do
    ( cd "$dirpath" && perl perlscript.pl *.fasta )
done

이는 Perl 스크립트가 항상 호출되고 perlscript.pl(예제 디렉토리 레이아웃에 표시된 대로) 각 디렉토리에서 Perl 스크립트를 실행하는 올바른 방법은 다음과 같다고 가정합니다.

perl perlscript.pl *.fasta

위 루프에서 괄호는 하위 쉘을 생성합니다. 이렇게 하면 스크립트의 나머지 부분에 영향을 주지 않으며 Perl 스크립트를 실행한 후 디렉터리를 종료할 cd필요가 없습니다 .cd

이 루프는 모든 하위 디렉터리를 반복 Parent_directory하고 각 하위 디렉터리에서 지정된 명령을 실행합니다.

답변2

find조건자를 지원하는 경우 -execdir(적어도 GNU, BSD):

find . -name perlscript.pl -execdir sh -c 'exec perl ./perlscript.pl *.fasta' \;

파일을 검색 perlscript.pl하고 실행하여 perl현재 디렉터리를 해당 파일이 발견된 디렉터리로 설정합니다.

*.fasta전역을 확장하려면 쉘이 필요합니다 .

관련 정보