por que isso funciona em um shell para loop, mas não por si só

1

por que isso funciona

for X in A* ; do cp $X/output.txt output/$X.txt ; done

mas não isso

cp A*/output.txt output/A*.txt

Para copiar o arquivo output.txt de várias pastas chamadas A1, A2, A3, A4, etc. em uma pasta combinada chamada "saída", fornecendo a cada arquivo de texto o nome da pasta de onde veio.

    
por Kirt 05.12.2013 / 16:14

2 respostas

5

Como o shell expande a parte A*.txt para vários caminhos antes de ser passado para o comando que está sendo invocado ( cp neste caso).

Isso significa que, no primeiro caso, se você tiver arquivos denominados A1.txt, A2.txt, A3.txt e A4.txt e diretórios A1, A2, A3 e A4, cada um contendo o arquivo output.txt, ele será expandido para algo como :

for X in A1.txt A2.txt A3.txt A4.txt ; do cp $X/output.txt output/$X.txt ; done

e no segundo caso, ele se expande para:

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A*.txt

onde a parte output/A*.txt pode ou não expandir dependendo se existe alguma coisa no diretório output correspondente à glob. Se isso acontecer, fica ainda pior, como:

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A8.txt output/A9.txt

Como cp , quando dado vários arquivos de origem, quer um diretório de destino no final, ele não sabe como lidar com isso e simplesmente ergue as mãos e dá um erro.

    
por 05.12.2013 / 16:23
0

A razão é que, se houver mais de dois argumentos para cp , o último deve ser um diretório. A Página man cp declara:

Synopsis

cp [OPTION]... [-T] SOURCE DEST

cp [OPTION]... SOURCE... DIRECTORY

cp [OPTION]... -t DIRECTORY SOURCE...

Description

Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

O comando que você escreveu,

  cp file1 file2 file3 file4

pretendia significar

 cp file1 file3; cp file2 file4

mas não, pela razão acima. O loop for produz exatamente as duas instruções imediatamente acima, que é o que você realmente quer.

    
por 05.12.2013 / 16:41

Tags