Por que o asterisco produz resultados inesperados em localizar? [duplicado]

0

Sou novo no Bash. A partir da documentação do Finding Files :

You want to find every file in ~/mydir and all its subdirectories, recursively, with a file extension of .htm (or .HTM or .Htm...) and delete it. I've seen a lot of attempts like rm -rf ~/mydir/*.htm which really don't come close. The correct solution is

find ~/mydir -iname '*.htm' -exec rm {} \;

-iname says that you want to do a case-insensitive search on the filename. '*.htm' is in single quotes to prevent bash from expanding the *, which will produce unexpected results.

Pergunta: O que o asterisco produz com e sem as aspas? Por que você decidiu usar citações versus não?

    
por Hatshepsut 25.07.2015 / 23:15

3 respostas

1

Sem aspas, o shell expande *.htm para uma lista de arquivos e passa essa lista para find . Com aspas, o shell fornece a string de cinco caracteres *.htm como um argumento para find .

Por exemplo, com aspas:

$ ls
a.htm  b.htm
$ echo find . -iname '*.htm'
find . -iname *.htm
$ find . -iname '*.htm'
./b.htm
./a.htm

O acima funciona como desejado. Sem aspas, find recebe argumentos que não sabe como processar:

$ echo find . -iname *.htm
find . -iname a.htm b.htm
$ find . -iname *.htm
find: paths must precede expression: b.htm
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
    
por John1024 25.07.2015 / 23:28
0

Que tal um exemplo primeiro, aqui estamos procurando todos os arquivos com .htm extension (sem distinção entre maiúsculas e minúsculas) de forma recursiva:

$ tree 
.
├── spam
│   ├── egg.htm
│   └── egg.Htm
├── spam.htm
└── spam.Htm


$ find . -type f -iname *.htm
./spam.htm
./spam.Htm

$ find . -type f -iname '*.htm'
./spam.htm
./spam/egg.htm
./spam/egg.Htm
./spam.Htm

Como você pode ver no primeiro caso em que não usei nenhuma citação -iname *.htm , o nome do arquivo foi submetido à expansão glob ( * ) primeiro (feito por shell, antes de find iniciar) como eu tenho não usei nenhuma citação e resulte em:

find . -type f -iname spam.htm spam.Htm

i.e. todos os arquivos no diretório atual com uma extensão .htm (sem distinção entre maiúsculas e minúsculas). Como resultado, embora o subdiretório ./spam tenha dois arquivos com extensão .htm , eles não serão encontrados, pois estamos procurando os arquivos spam.htm ou spam.Htm .

Por outro lado, no segundo caso find . -type f -iname '*.htm' , usamos aspas para que os nomes dos arquivos não fiquem sujeitos à expansão glob, portanto, obteremos o resultado desejado.

    
por heemayl 25.07.2015 / 23:33
0

Eu acredito que o que você está procurando entender é um processo chamado Quoting. As citações funcionam com aspas duplas e aspas simples.

Se você colocar texto entre aspas duplas, todos os caracteres especiais usados pelo shell perderão seu significado, exceto $ (cifrão), \ (barra invertida) e '(caractere de retrocesso).

As aspas simples suprimem todas as expansões.

Escaping Characters também é algo a ser dado em tais situações. Você pode preceder um caractere com um \ (barra invertida) para transformá-lo em um caractere de escape. Isso é feito com frequência entre aspas duplas para impedir seletivamente uma expansão.

echo "This bowl costs \.00"
This bowl costs $10.00

Aqui $ seria o personagem de fuga.

    
por shredalert 25.07.2015 / 23:37