Entendendo o Ambiente Linux com barras invertidas e asteriscos

2

Eu tenho duas perguntas relacionadas em um ambiente Linux.

Estou confuso quando usar barra invertida \ e combinando com asterisco "*". Quando tento executar o Unzip * .zip, o comando falha até que eu escape dele. Por que isso acontece?

developer@tz:~/f$ bash -version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
developer@tz:~/f$ unzip *.zip
Archive:  abstract.zip
caution: filename not matched:  date-function.zip
developer@tz:~/f$ unzip \*.zip
Archive:  abstract.zip
  inflating: abstract.xsl            

Archive:  date-function.zip
warning [date-function.zip]:  zipfile is empty

1 archive was successfully processed.
1 archive had warnings but no fatal errors.
developer@tz:~/f$ ls *.zip
abstract.zip  date-function.zip
developer@tz:~/f$ ls \*.zip
ls: cannot access '*.zip': No such file or directory

Sobre o problema semelhante em relação às funções de uma linha.

Suponha que eu tenha arquivos zip: foo.zip e bar.zip no mesmo diretório e eu preciso extrair ambos; quando eu faço:

ls *.zip | xargs -IZIP  basename -s .zip ZIP

os comandos acima irão listar: foo e bar no konsole, mas quando eu corro:

ls *.zip | xargs -IZIP unzip ZIP -d $( basename -s .zip ZIP )

falha ao executar porque quando eu passar os resultados da base, NÃO obtém um valor, por isso falha.

  1. Quando uso "\" ou "*" ou combina ambos ao invocar comandos konsole?
  2. Como posso extrair o arquivo zip para um diretório com seu próprio nome?
por Noel Alex Makumuli 03.07.2017 / 10:40

1 resposta

4

O uso de unzip em particular pode causar alguma confusão. Pode ser chamado como

$ unzip x.zip file-1 file-2 file-3

em que file-1 e semelhantes são arquivos contidos em x.zip . Para o restante desta resposta, presumirei que o diretório atual contém dois arquivos .zip : x.zip e y.zip .

Quando o shell executa uma expansão glob (curingas como * ou ? ), cada arquivo correspondente se torna um argumento separado. Então

$ unzip *.zip

se transforma em

$ unzip x.zip y.zip

Lembre-se, esta sintaxe significa "extrair o arquivo y.zip do arquivo x.zip ". Para permitir vários arquivamentos, unzip também processará curingas. Se você quiser deixar unzip manipular os curingas em vez do shell, você deve citar ou escapar deles:

$ unzip \*.zip

ou

$ unzip '*.zip'
    
por 03.07.2017 / 10:59