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 dengangrep "*"
, 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
.