¿Por qué barra invertida antes del asterisco en `find`?

9

En este comando:

find . -name \*.pyc -delete

¿Por qué se necesita una barra invertida antes *.pyc?

Ram Rachum
fuente
La página de manual para finddebe tener una sección llamada NON-BUGScon algo similar como ejemplo y una explicación de por qué es necesaria.
Brian

Respuestas:

19

El shell expandiría un globo sin comillas antes de findejecutarlo. (Consulte Expansión del nombre de archivo en el manual).

Entonces diciendo:

find . -name *.pyc -delete

en realidad ejecutaría:

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

suponiendo que haya 3 archivos .pyc en el directorio actual y que en su lugar se produzca un error.

Una barra invertida hace que el shell pase el globo a find, es decir, actúa como si *.pycse citara.

Idealmente, debería citar un globo:

find . -name '*.pyc' -delete
devnull
fuente
@RamRachum, pero más caracteres al escribir.
Paul Draper
1
@PaulDraper Legible y menos propenso a errores> Más corto por una pulsación de tecla
Pomo
Las comillas simples son el camino a seguir. Nunca pensé que podría usar la barra invertida de esta manera ...
Floris
4

Antes de que su shell emita el findcomando, realizará varias expansiones . Al hacerlo, también procesa caracteres especiales (o caracteres con un significado especial), donde *hay un comodín: un carácter global. Esta es la llamada expansión de nombre de archivo.

Digamos que tiene dos archivos en su directorio:

  • foo.pyc
  • bar.pyc

Luego *.pycse expandiría a ambos nombres. Entonces si escribes:

find . -name *.pyc -delete

entonces el shell realmente llamará:

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

lo cual no tiene mucho sentido, porque solo puede tener un argumento para -name. Es por eso que necesita escapar del carácter especial para evitar que sea interpretado por el shell. Lo haces escapándose con una barra invertida o, alternativamente, citandolo.

slhck
fuente