Perché barra rovesciata prima dell'asterisco in `find`?


9

In questo comando:

find . -name \*.pyc -delete

Perché è necessaria una barra rovesciata prima *.pyc?


La pagina man di finddovrebbe avere una sezione chiamata NON-BUGScon qualcosa di simile come esempio e una spiegazione del perché è necessaria.
Brian,

Risposte:


19

Un glob non quotato verrebbe espanso dalla shell prima di findessere eseguito. (Consultare Espansione nome file nel manuale.)

Quindi dicendo:

find . -name *.pyc -delete

eseguirà effettivamente:

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

supponendo che ci fossero 3 file .pyc nella directory corrente e risultasse invece in un errore.

Una barra rovesciata fa passare la shell al glob find, cioè si comporta come se *.pycfosse quotata.

Idealmente, dovresti citare un glob:

find . -name '*.pyc' -delete

@RamRachum, ma più carattere durante la digitazione.
Paul Draper,

1
@PaulDraper Leggibile e meno soggetto a errori> Più breve di una sequenza di tasti
Doorknob

Le virgolette singole sono la strada da percorrere. Non ho mai nemmeno pensato di poter utilizzare la barra rovesciata in questo modo ...
Floris

4

Prima che la shell emetta il findcomando, eseguirà varie espansioni . In questo modo, elabora anche caratteri speciali (o, caratteri con un significato speciale), dove *è un jolly - un personaggio sconvolgente. Questa è la cosiddetta espansione del nome file.

Supponi di avere due file nella tua directory:

  • foo.pyc
  • bar.pyc

Quindi *.pycsi espanderebbe in entrambi i nomi. Quindi se scrivi:

find . -name *.pyc -delete

quindi la shell chiamerà effettivamente:

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

che non ha molto senso, perché puoi avere solo un argomento per -name. Ecco perché è necessario sfuggire al personaggio speciale per impedire che venga interpretato dalla shell. Lo fai facendo backslash-escape o, in alternativa, citandolo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.