qual é a diferença entre usar 'aspas simples' ou não no comando find

6
find ~/ -name *test.txt
find ~/ -name '*test.txt'

Eu preciso construir um exemplo onde o primeiro formulário falha, mas o segundo ainda funciona.

    
por Yunong 27.11.2014 / 00:16

4 respostas

20

As aspas protegem o conteúdo da expansão do curinga do shell. Execute esse comando (ou até mesmo mais simples apenas echo *test.txt em um diretório com um arquivo footest.txt e depois um sem nenhum arquivo que termine em test.txt e você verá a diferença.

$ ls
a  b  c  d  e
$ echo *test.txt
*test.txt
$ touch footest.txt
$ echo *test.txt
footest.txt

A mesma coisa acontecerá com o find.

$ set -x
$ find . -name *test.txt
+ find . -name footest.txt
./footest.txt
$ find . -name '*test.txt'
+ find . -name '*test.txt'
./footest.txt
$ touch bartest.txt
+ touch bartest.txt
$ find . -name *test.txt
+ find . -name bartest.txt footest.txt
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]
$ find . -name '*test.txt'
+ find . -name '*test.txt'
./bartest.txt
./footest.txt
    
por 27.11.2014 / 00:19
1

tl; versão dr

Você está passando uma string literal para o comando / programa, assim como as aspas duplas, mas diferem que as aspas simples impedem a expansão de curingas e variáveis curtas, enquanto as aspas duplas as expandem para a string literal.

Exemplo:

$ export MY_VAR=my_string
$ echo "$MY_VAR"
my_string
$ echo '$MY_VAR'
$MY_VAR

O mesmo se aplica a curingas

Espero que ajude.

EDITAR:

Um exemplo como o que você está pedindo é IMO impossível, porque qualquer literal que o segundo comando corresponde será inevitavelmente correspondido pelo caractere curinga no primeiro comando.

    
por 27.11.2014 / 00:29
1

Para complementar as outras respostas, zsh , fish e (t)csh são mais úteis aqui, pois podem ajudar você a mostrar seu erro antes que ele se torne um problema:

Se não houver nenhum arquivo *test.txt no diretório atual:

zsh$ find . -name *test.txt
zsh: no matches found: *test.txt

fish> find . -name *test.txt
fish: No matches for wildcard '*test.txt'.
find . -name *test.txt
             ^

tcsh> find . -name *test.txt
find: No match.

fish e zsh estão corretos em deixar claro que é o shell (não find ) que está reclamando aqui, enquanto o erro tcsh é enganoso. (tcsh reporta apenas No match no entanto se todos os globs na linha de comando não combinarem. Se algum jogo e alguns não, aqueles que não irão se expandir como em Bourne-like conchas).

Com bash , você pode obter o mesmo comportamento com:

$ shopt -s failglob
$ find . -name *test.txt
bash: no match: *test.txt
    
por 27.11.2014 / 15:36
-3

No primeiro caso, o argumento *test.txt é considerado um operador do comando find , enquanto com aspas, o argumento *test.txt será considerado um parâmetro para um comutador de find .

Se você tiver mais de um arquivo de texto com a extensão .txt em seu diretório atual, o seguinte falhará, pois a localização não verá um argumento *.txt :

find . -name *.txt

Considerando que isso será bem sucedido:

find . -name '*.txt'
    
por 27.11.2014 / 00:24