Descompacte os argumentos de origem

5

Para copiar vários arquivos zip de um local para outro:

$ cp *.zip destination/

Para descompactar vários arquivos zip em um diretório:

$ unzip \*.zip -d destination/

man unzip diz:

The backslash before the asterisk is only required if the shell expands wildcards, as in Unix

O que me confunde é que os dois comandos não parecem se comportar da mesma maneira. Por que eles não? Existe uma maneira de saber ou adivinhar como cada comando se comporta, apenas lembrando ou lendo as páginas do manual todas as vezes?

É diferente porque cp é implementado para receber vários argumentos de origem enquanto unzip não é? unzip pode pegar uma string com curingas, por que não implementar vários arquivos de origem?

Qual é a maneira padrão de obter argumentos de origem? É cp que realmente faz muito?

    
por Gauthier 13.12.2014 / 18:40

2 respostas

5

Se você tem dois arquivos zip a.zip e b.zip em seu diretório atual, então

$ cp *.zip destination/

expande para

$ cp a.zip b.zip destination/

A semântica para cp é copiar os a.zip e b.zip para o destino.

Se você digitar

$ cp \*.zip destination/

simplesmente "expande" para

$ cp '*.zip' destination/

i.e. ele tentará copiar um único arquivo chamado "* .zip" para o destino, o que não é o que você deseja.

Por outro lado, se você digitar

$ unzip *.zip -d destination/

ele será novamente expandido para

$ unzip a.zip b.zip -d destination/

A semântica para unzip é encontrar um arquivo chamado "b.zip" dentro do arquivo "a.zip", que não é mais o que você deseja.

Se você digitar

$ unzip \*.zip -d destination/

O comando unzip não tenta simplesmente descompactar o arquivo chamado *.zip , mas irá descompactar todos os arquivos terminados em .zip .

A diferença é que ambos os comandos interpretam seus argumentos de maneira diferente.

    
por 13.12.2014 / 19:28
3

Pelo contrário, o descompactar faz muito. cp não precisa analisar os nomes dos arquivos, tudo o que precisa fazer é passar por cima deles.

Descompactar, por outro lado, precisa ver se um argumento é um caractere curinga, verifique a lista de diretórios para ver o que corresponde ao caractere curinga e, em seguida, faça um loop sobre eles. E observe que o shell já é capaz de corresponder e expandir curingas, portanto, descompactar é duplicar a funcionalidade.

    
por 13.12.2014 / 19:02