GNU/Linux >> Belajar Linux >  >> Ubuntu

Bingung Tentang Grep Dan * Wildcard?

Saya menjalankan perintah berikut untuk menemukan semua file/direktori yang tidak ada hubungannya dengan “flash_drive_data”:

find . -not -path './flash_drive_data*' | grep "./*flash*"

Ada beberapa hal yang saya coba yang membingungkan saya:

1. Ketika saya menjalankan perintah di atas, saya mendapatkan beberapa klik "sebagian" (yaitu tidak sepenuhnya cocok dengan *flash* pola. Misalnya:

./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi

3/flas di akhir sedang disorot.

2. Ketika saya mengganti grep "*flash*" hanya dengan grep "*" , Saya berharap mendapatkan semua file dikembalikan dengan find, tetapi saya tidak mendapatkannya. Mengapa? Kemudian, ketika saya melakukan grep "**" Saya yakin saya mendapatkan semua file (atau setidaknya saya pikir saya mendapatkannya). Sekali lagi, kenapa begitu?

3. Akhirnya, tujuan dari apa yang saya lakukan di atas adalah untuk memastikan bahwa ketika saya menjalankan find . -not -path './flash_drive_data*' Saya tidak mendapatkan apa pun yang terkait dengan flash_drive_data. Sepertinya saya melakukannya (dengan beberapa perilaku tak terduga dengan grep seperti yang saya jelaskan di atas). Namun, ketika saya menjalankan:
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +

Saya mendapatkan keluaran termasuk hal-hal seperti:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

jadi file flash_drive_data disertakan.

Jawaban yang Diterima:

find . -not -path './flash_drive_data*' | grep "./*flash*"

Masalahnya di sini adalah grep menggunakan ekspresi reguler, sedangkan find -path menggunakan kecocokan pola gaya glob Shell. Tanda bintang memiliki arti yang berbeda pada keduanya.

Ekspresi reguler ./*flash* cocok terlebih dahulu dengan karakter apa pun (. ), lalu nol atau lebih garis miring (/* ), lalu string literal flas , lalu sembarang angka (nol atau lebih) dari h karakter. 3/flas cocok dengan itu (dengan nol kali h ), dan begitu juga mis. reflash (dengan nol kali / ).

Anda bisa menggunakan grep flash sebagai gantinya, mengingat itu cocok di mana saja di input, jadi bagian depan dan belakang "cocok dengan apa pun" tidak diperlukan.

Atau gunakan find -path './*flash*' -and -not -path './flash_drive_data*'

Ketika saya mengganti grep "*flash*" hanya dengan grep "*" , saya mendapatkan [tidak ada yang cocok].

Karena tanda bintang berarti "sejumlah atom sebelumnya", itu tidak didefinisikan dengan baik di sini. grep menafsirkan itu sebagai tanda bintang literal, tetapi sebenarnya itu adalah kesalahan.

Namun, ketika saya menjalankan:find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' + Saya mendapatkan keluaran termasuk hal-hal seperti:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

jadi flash_drive_data file sedang disertakan.

Perhatikan bahwa tar menyimpan file secara rekursif, dan output pertama dari find adalah . untuk direktori saat ini, jadi semuanya akan disimpan. Anda mungkin ingin menggunakan ! -type d dengan find untuk mengecualikan direktori dari output, atau (lebih baik), lihat -exclude=PATTERN opsi untuk tar .


Ubuntu
  1. Temukan Alamat MAC di Ubuntu 21.10

  2. Batasi Cari Keluaran Dan Hindari Sinyal 13?

  3. Grep Untuk Beberapa String Dalam File, Dan Kemudian Buat Daftar File Dalam Urutan Ukuran?

  1. Potong / Grep Dan Df -h?

  2. Bagaimana Menemukan Jenis File Img Dan Memasangnya?

  3. Menemukan file yang dapat dieksekusi menggunakan ls dan grep

  1. Apa arti dari fork() dan grep di Linux?

  2. Apa perbedaan antara 'temukan' dan 'temukan' di Linux?

  3. Bagaimana menemukan informasi tentang RAM?