Por que a barra invertida antes do asterisco em `find`?


9

Neste comando:

find . -name \*.pyc -delete

Por que uma barra invertida é necessária antes *.pyc?


A página de manual finddeve ter uma seção chamada NON-BUGScom algo semelhante como exemplo e uma explicação de por que é necessário.
5608 Brian

Respostas:


19

Um globo não citado seria expandido pelo shell antes de findser executado. (Consulte Expansão do nome do arquivo no manual.)

Dizendo assim:

find . -name *.pyc -delete

realmente executaria:

find . -name file1.pyc file2.pyc file3.pyc -delete

assumindo que havia 3 arquivos .pyc no diretório atual e resultando em um erro.

Uma barra invertida faz com que a concha passe o globo para find, isto é, age como se tivesse *.pycsido citada.

Idealmente, você deve citar um globo:

find . -name '*.pyc' -delete

@RamRachum, mas com mais caracteres ao digitar.
Paul Draper

11
@PaulDraper legível e menos propenso a erros> Shorter por um keystroke
Doorknob

Aspas simples são o caminho a percorrer. Eu nunca sequer pensou que poderia usar a barra invertida desta forma ...
Floris

4

Antes de seu shell emitir o findcomando, ele fará várias expansões . Ao fazer isso, ele também processa caracteres especiais (ou caracteres com significado especial), onde *existe um curinga - um caractere brilhante. Essa é a chamada expansão de nome de arquivo.

Digamos que você tenha dois arquivos no seu diretório:

  • foo.pyc
  • bar.pyc

Então *.pycexpandiria para os dois nomes. Então, se você escrever:

find . -name *.pyc -delete

então o shell realmente chamará:

find . -name foo.pyc bar.pyc -delete

o que não faz muito sentido, porque você só pode ter um argumento para -name. É por isso que você precisa escapar do caractere especial para impedir que ele seja interpretado pelo shell. Você faz isso escapando pela barra invertida ou, alternativamente, citando-o.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.