Usando aspas duplas ou nenhuma aspas com curingas

Usando aspas duplas ou nenhuma aspas com curingas

eu me depareiesseartigo que tenta explicar o comando find. Ele dá um exemplo de

find /tmp -iname "data*.txt"

agora este artigoaquiafirma que

Aspas duplas não suprimem a substituição de palavras que começam com "$"mas suprimem a expansão de caracteres curinga.

Além disso, quando tentei 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 caso seriam diferentes? Por que as aspas duplas não suprimem a expansão do curinga em A? Tive a impressão de que A não funcionaria e apenas B funcionaria.

Responder1

No caso B:

find . -iname *gall*

Oconchairá se expandir *gall*em uma lista de todos os arquivos que correspondem a esse padrão. Como você tem apenas um arquivo em seu diretório atual que corresponde a esse padrão, isso se torna:

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

... então find irá procurar por arquivos que correspondam a esse nome exato. foo-gallifrey-road-doctors-14437-1366x768.jpgnão seria encontrado. Se você tivesse dois ou mais arquivos que correspondam ao glob, você acabaria com um comando find malformado; Tenho certeza de que simplesmente sairia com um erro.

No caso A:

find . -iname "*gall*"

Por causa das aspas, o shellnão vaiexpanda o padrão. Isso simplesmente se torna (isto é o que findvê):

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 encontrará gallifrey-road-doctors-14437-1366x768.jpgtodos foo-gallifrey-road-doctors-14437-1366x768.jpgos arquivos que correspondam ao padrão *gall*.

Então: seu comando passa pelo shell (que não expande globs entre aspas e remove a camada mais externa de aspas) eentãopassa por find, que usa internamente o padrão para corresponder aos nomes dos arquivos.

informação relacionada