Como se referir a vários arquivos de um diretório para um comando

2

Eu tenho um comando que precisa ter vários arquivos de entrada, que são originalmente de um diretório e possuem determinados padrões de nome de arquivo. Por exemplo:

No diretório

/home/mydir/

Eu tenho arquivos:

A.dat
B.dat
C.dat
readme.doc

Eu gostaria de aprender como passar todos os arquivos com o final de ".dat" para esse comando, que deve se parecer com:

command A.dat B.dat C.dat > /home/outputdir/output.dat

Eu poderia fazer isso em python, por exemplo armazenando os nomes dos arquivos em uma lista, mas como devo fazê-lo no shell, por favor? Muito obrigado.

    
por Helene 20.06.2016 / 19:37

2 respostas

4

Um shell UNIX padrão fará algo chamado globbing ; isso usa caracteres especiais para significar, por exemplo, um caractere ( ? ) ou qualquer número de caracteres ( * ). Para usar o seu exemplo, você poderia executar (onde o $ inicial representa seu prompt de comando e não algo que você digitaria):

$ command /home/mydir/*.dat > /home/outputdir/output.dat

Seu shell expandirá isso para:

$ command /home/mydir/A.dat /home/mydir/B.dat /home/mydir/C.dat > /home/outputdir/output.dat

antes de realmente chamar o comando. O * diz "pegue qualquer nome de arquivo em / home / mydir que termine com" .dat ".

Para algumas variações do comando, dados os mesmos arquivos de entrada:

# all of the sample input files have a single letter before the ".dat"
$ command /home/mydir/?.dat > /home/outputdir/output.dat

# the square brackets say "any (one) of these characters"
$ command /home/mydir/[ABC].dat > /home/outputdir/output.dat
    
por 20.06.2016 / 20:26
2

A resposta realmente depende da ferramenta que você está tentando usar. Alguns são projetados para aceitar vários arquivos como parâmetros, o que pode ser feito com:

/path/to/some/tool file1 /path/to/file2 /path/to/lotsafiles/*

Outros são projetados para aceitar apenas um arquivo como um parâmetro, e assim terá que ser repetidamente chamado com cada arquivo que você deseja endereçar, o que seria feito desta forma:

for file in file1 /path/to/file2 /path/to/lotsafiles/*; do
    /path/to/some/tool "$file"
done

Para saber se você deve ou não especificar apenas um arquivo por vez, consulte a página de manual do programa ( man tool ).

    
por 20.06.2016 / 19:42