passa todos os arquivos no diretório como um argumento para o script perl

1

Eu tenho um diretório com 50 arquivos e eu quero passar todos eles simultaneamente para um script perl com apenas um espaço entre nomes, como em ...

./perl_script.pl file1 file2 file3 .. file50

Todos os arquivos têm nomes não numéricos.

Eu entendo como passar todos os arquivos para o script perl, um de cada vez em loop, mas estou com dificuldades para passar todos os arquivos de uma só vez.

    
por erik 01.03.2015 / 20:31

1 resposta

4

O recurso que você está procurando é manipulado pelo shell. É chamado de expansão do nome do caminho . Por exemplo, suponha que você esteja em um diretório que contenha os arquivos file1 file2 file3 .. file50. Você pode especificar todos os arquivos no diretório que começam com file como um argumento para o seu script perl via:

./perl_script.pl file*

Para o shell, * significa zero ou movimento de qualquer caractere. O shell procura todos os arquivos cujos nomes começam com file e são seguidos por zero ou mais de qualquer caractere. Além disso, se você quiser especificar todos os arquivos do diretório atual:

./perl_script.pl *

Se você quiser especificar todos os arquivos em algum outro diretório, use:

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

Observe que esse é um recurso de shell, não um recurso de perl. O shell faz a expansão do nome do caminho antes da lista de argumentos ser passada para o perl. Conseqüentemente, funcionará qualquer comando shell. Se você quiser testar a expansão do nome do caminho sem realmente executar o script perl, você pode simplesmente usar o echo:

echo /some/other/dir/*

Isso mostrará os mesmos resultados da expansão do nome do caminho que o script perl verá.

Casos especiais

Por padrão, se não houver um arquivo que corresponda ao seu padrão, o próprio padrão será retornado:

$ echo *bash*
*bash*

Em bash , esse comportamento pode ser alterado com as opções nullglob e globfail .

Além disso, os arquivos cujos nomes começam com um período, por padrão, não são incluídos nas expansões do nome do caminho. Eles serão incluídos, no entanto, se você especificar um padrão que comece com um período:

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

Mais recursos

Além de * , existe o caractere especial ? , que significa qualquer caractere. Portanto, file? seria expandido para o arquivo1, mas não para o arquivo10.

Também é possível especificar grupos de caracteres. Assim, file[123] expandiria, supondo que eles existissem, para os arquivos file1, file2, file3, mas não file4. file[[:digit:]] se expande para todos os arquivos cujos nomes consistem em file seguidos por um e apenas um dígito.

Os shells avançados, como o bash, têm muito mais opções. Leia sobre eles em "expansão do nome do caminho" em man bash .

    
por 01.03.2015 / 21:29