Mengapa backslash sebelum asterisk di `find`?

9

Dalam perintah ini:

find . -name \*.pyc -delete

Mengapa backslash diperlukan sebelumnya *.pyc?

Ram Rachum
sumber
Halaman manual untuk findharus memiliki bagian yang disebut NON-BUGSdengan sesuatu yang mirip sebagai contoh dan penjelasan mengapa diperlukan.
Brian

Jawaban:

19

Glob yang tidak dikutip akan diperluas oleh shell sebelum finddieksekusi. (Lihat Ekspansi Nama File di manual.)

Jadi mengatakan:

find . -name *.pyc -delete

akan benar-benar mengeksekusi:

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

dengan asumsi ada 3 file .pyc di direktori saat ini dan menghasilkan kesalahan sebagai gantinya.

Sebuah backslash membuat shell melewati glob find, artinya bertindak seperti *.pycdikutip.

Idealnya, Anda harus mengutip sebuah bola:

find . -name '*.pyc' -delete
devnull
sumber
@RamRachum, tetapi lebih banyak karakter saat mengetik.
Paul Draper
1
@PaulDraper Dapat dibaca dan kurang rentan terhadap kesalahan> Lebih singkat dengan satu penekanan tombol
Doorknob
Kutipan tunggal adalah caranya. Saya bahkan tidak pernah berpikir Anda bisa menggunakan backslash dengan cara ini ...
Floris
4

Sebelum shell Anda mengeluarkan findperintah, ia akan melakukan berbagai ekspansi . Melakukannya, itu juga memproses karakter khusus (atau, karakter dengan makna khusus), di mana *wildcard - karakter globbing. Ini adalah apa yang disebut ekspansi nama file.

Katakanlah Anda memiliki dua file di direktori Anda:

  • foo.pyc
  • bar.pyc

Maka *.pycakan berkembang menjadi kedua nama. Jadi, jika Anda menulis:

find . -name *.pyc -delete

maka shell akan benar-benar memanggil:

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

yang tidak masuk akal, karena Anda hanya dapat memiliki satu argumen -name. Itu sebabnya Anda perlu melarikan diri karakter khusus untuk mencegahnya ditafsirkan oleh shell. Anda melakukannya dengan melarikan diri backslash, atau sebagai alternatif, mengutipnya.

slhck
sumber