Usando duas ou nenhuma aspas com curingas

1

Me deparei com este artigo que tenta explicar a comando find.Ele dá um exemplo de

find /tmp -iname "data*.txt"

agora este artigo aqui afirma que

Double quotes do not suppress the substitution of words that begin with "$" but they do suppress the expansion of wildcard characters.

Além disso, quando experimentei os dois comandos

admin@localhost Downloads$ ls
gallifrey-road-doctors-14437-1366x768.jpg  mydir
admin@localhost Downloads$ find . -iname "*gall*"
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname "*gall*"  -----> A
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$ find . -iname *gall*    -----> B
./gallifrey-road-doctors-14437-1366x768.jpg
admin@localhost Downloads$

A saída parece ser a mesma. Em que casos eles seriam diferentes? Por que as aspas duplas não estão suprimindo a expansão do curinga em A ? Fiquei com a impressão de que A não funcionaria e só que B funcionaria.

    
por Rajeshwar 16.11.2014 / 19:20

1 resposta

2

No caso B:

find . -iname *gall*

O shell expandirá *gall* para uma lista de todos os arquivos correspondentes a esse padrão. Como você tem apenas um arquivo no diretório atual que corresponde a esse padrão, isso se torna:

find . -iname gallifrey-road-doctors-14437-1366x768.jpg

... então, o find procurará arquivos correspondentes a esse nome exato. foo-gallifrey-road-doctors-14437-1366x768.jpg não foi encontrado. Se você tivesse dois ou mais arquivos que correspondem ao glob, você acabaria com um comando find malformado; Tenho certeza que seria simplesmente sair com um erro.

No caso A:

find . -iname "*gall*"

Por causa das aspas, o shell não irá expandir o padrão. Isso só se torna (é isso que find vê):

find . -iname *gall*

Depois disso, o comando find usa esse padrão para procurar todos os arquivos (e diretórios, etc.) que correspondam a esse padrão. Isso localizará gallifrey-road-doctors-14437-1366x768.jpg e foo-gallifrey-road-doctors-14437-1366x768.jpg e todos os arquivos que corresponderem ao padrão *gall* .

Então: seu comando passa pelo shell (que não expande globs entre aspas e retira a camada mais externa de aspas), e então passa para find , que usa internamente o padrão para combinar nomes de arquivos.

    
por 16.11.2014 / 20:01