Pourquoi une barre oblique inverse avant l'astérisque dans `find`?

9

Dans cette commande:

find . -name \*.pyc -delete

Pourquoi une barre oblique inverse est-elle nécessaire avant *.pyc?

Ram Rachum
la source
La page de manuel de finddevrait avoir une section appelée NON-BUGSavec quelque chose de similaire comme exemple et une explication de la raison pour laquelle elle est nécessaire.
Brian

Réponses:

19

Un glob sans guillemets serait développé par le shell avant d' findêtre exécuté. (Reportez-vous à Extension de nom de fichier dans le manuel.)

Dire ainsi:

find . -name *.pyc -delete

exécuterait en fait:

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

en supposant qu'il y avait 3 fichiers .pyc dans le répertoire en cours et entraîner une erreur à la place.

Une barre oblique inverse fait passer le shell au glob find, c'est- à -dire qu'il agit comme s'il *.pycétait cité.

Idéalement, vous devriez citer un glob:

find . -name '*.pyc' -delete
devnull
la source
@RamRachum, mais plus de caractère lors de la frappe.
Paul Draper
1
@PaulDraper Lisable et moins sujet aux erreurs> Plus court d'une seule touche
Poignée de porte
Les guillemets simples sont la voie à suivre. Je n'ai même jamais pensé que vous pouviez utiliser la barre oblique inverse de cette façon ...
Floris
4

Avant que votre shell émette la findcommande, il effectuera diverses extensions . Ce faisant, il traite également les caractères spéciaux (ou les caractères ayant une signification particulière), où se *trouve un caractère générique - un caractère globbing. Il s'agit de ce que l'on appelle l'extension de nom de fichier.

Supposons que vous ayez deux fichiers dans votre répertoire:

  • foo.pyc
  • bar.pyc

Ensuite , *.pycélargirait aux deux noms. Donc, si vous écrivez:

find . -name *.pyc -delete

alors le shell appellera en fait:

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

ce qui n'a pas beaucoup de sens, car vous ne pouvez avoir qu'un seul argument -name. C'est pourquoi vous devez échapper le caractère spécial pour l'empêcher d'être interprété par le shell. Pour ce faire, vous devez échapper la barre oblique inversée ou le citer.

slhck
la source