아래와 같이 여러 하위 디렉터리가 있는 상위 디렉터리가 있습니다.
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
전역을 확장하려면 쉘이 필요합니다 .