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 "output", fornecendo a cada arquivo de texto o nome da pasta de origem.
Respostas:
Como o shell expande a
A*.txt
peça para vários caminhos antes de ser passada para o comando que está sendo chamado (cp
neste caso).Isso significa que, no primeiro caso, se você tiver arquivos com o nome A1.txt, A2.txt, A3.txt e A4.txt e os diretórios A1, A2, A3 e A4, cada um contendo output.txt, ele se expandirá para algo como :
e no segundo caso, ele se expande para:
onde a
output/A*.txt
peça pode ou não ser expandida, dependendo da existência de algo nooutput
diretório que corresponda ao glob. Se isso acontecer, fica ainda pior, como:Como
cp
quando vários arquivos de origem desejam um diretório de destino no final, ele não sabe como lidar com isso e simplesmente levanta as mãos e gera um erro.fonte
O motivo é que, se houver mais de dois argumentos
cp
, o último deve ser um diretório. A página de manual do cp declara:O comando que você escreveu,
foi destinado a significar
mas não, pelo motivo acima. O loop for produz exatamente as duas instruções imediatamente acima, que é o que você realmente deseja.
fonte