Mengapa backslash sebelum asterisk di `find`?


9

Dalam perintah ini:

find . -name \*.pyc -delete

Mengapa backslash diperlukan sebelumnya *.pyc?


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

@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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.