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.