디렉터리의 모든 파일을 Perl 스크립트에 매개변수로 전달합니다.

디렉터리의 모든 파일을 Perl 스크립트에 매개변수로 전달합니다.

나는 50개의 파일이 있는 디렉토리를 가지고 있으며 다음과 같은 이름 사이에 공백만 사용하여 이 모든 파일을 동시에 Perl 스크립트에 전달하고 싶습니다.

./perl_script.pl file1 file2 file3 .. file50

이 파일들은 모두 숫자가 아닌 이름을 가지고 있습니다.

루프에서 한 번에 모든 파일을 Perl 스크립트에 전달하는 방법을 이해하지만 모든 파일을 한 번에 전달하는 데 문제가 있습니다.

답변1

당신이 찾고 있는 기능은 쉘에 의해 처리됩니다. 그것은 알려져있다경로명 확장. 예를 들어, file1 file2 file3 .. file50 파일이 포함된 디렉토리에 있다고 가정합니다. 다음으로 시작하는 디렉터리의 모든 파일을 지정할 수 있습니다 file.

./perl_script.pl file*

셸의 경우 *문자를 0으로 설정하거나 이동하는 것을 의미합니다. 쉘은 file이름이 0개 이상의 문자로 시작하고 뒤에 오는 모든 파일을 찾습니다. 또한 현재 디렉터리의 모든 파일을 지정하려면 다음을 수행하세요.

./perl_script.pl *

다른 디렉토리의 모든 파일을 지정하려면 다음을 사용하십시오.

./perl_script.pl /some/other/dir/*

이는 Perl 기능이 아닌 쉘 기능입니다. 쉘은 경로 이름 확장을 수행합니다.앞으로매개변수 목록은 Perl에 전달됩니다. 따라서 모든 쉘 명령과 함께 작동합니다. 실제로 Perl 스크립트를 실행하지 않고 경로 이름 확장을 테스트하려면 echo를 사용하면 됩니다.

echo /some/other/dir/*

그러면 Perl 스크립트에서 볼 수 있는 것과 동일한 경로 이름 확장 결과가 표시됩니다.

특별한 경우

기본적으로 패턴과 일치하는 파일이 없으면 패턴 자체가 반환됩니다.

$ echo *bash*
*bash*

bash이 동작은 아래 및 옵션을 사용하여 변경할 수 있습니다 .nullglobglobfail

또한 이름이 마침표로 시작하는 파일은 기본적으로 경로 이름 확장에 포함되지 않습니다. 그러나 마침표로 시작하는 패턴을 지정하면 해당 패턴이 포함됩니다.

$ echo .*bash*
.bash_history .bash_logout .bash_profile .bashrc

더 많은 기능

그 외에도 어떤 문자를 대표하는 *특수문자가 있습니다 . ?따라서 file?file10 대신 file1로 확장됩니다.

문자 그룹도 지정할 수 있습니다. 따라서 file[123]파일이 존재한다고 가정하면 file1, file2, file3 파일은 확장되지만 file4는 확장되지 않습니다. 이름이 하나의 숫자로만 구성된 모든 파일 file[[:digit:]]로 확장됩니다 .file

Bash와 같은 고급 쉘에는 더 많은 옵션이 있습니다. 의 "경로 이름 확장"에서 이에 대해 읽어보세요 man bash.

관련 정보