Saya memiliki struktur direktori seperti ini
data
|___
|
abc
|____incoming
def
|____incoming
|____processed
123
|___incoming
456
|___incoming
|___processed
Ada sub-folder masuk di semua folder di dalam direktori Data. Saya ingin mendapatkan semua file dari semua folder dan sub-folder kecuali direktori def / masuk dan 456 / masuk. Saya mencoba dengan perintah berikut
find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print
tetapi tidak berfungsi seperti yang diharapkan.
Ravi
grep -v something
gunakan pipa untuk mengecualikan apa pun yang tidak Anda inginkanJawaban:
Ini bekerja:
Penjelasan:
find /home/feeds/data
: mulai mencari secara rekursif dari jalur yang ditentukan-type f
: temukan file saja-not -path "*def/incoming*"
: jangan menyertakan apa pun dengandef/incoming
sebagai bagian dari jalurnya-not -path "*456/incoming*"
: jangan menyertakan apa pun dengan456/incoming
sebagai bagian dari jalurnyasumber
-path
cocok dengan seluruh string, jadi jika Anda melakukannyafind .
, maka-path
string Anda harus./path/to/directory/*
-not -path
pasti akan berfungsi dalam contoh ini tetapifind
masih melakukan iterasi ke dalam struktur direktori dan menggunakan siklus cpu untuk mengulangi semua direktori / file tersebut. untuk mencegahfind
iterasi atas direktori / file tersebut (mungkin ada jutaan file di sana) maka Anda perlu menggunakan-prune
(-prune
opsi ini sulit digunakan).Hanya demi dokumentasi: Anda mungkin harus menggali lebih dalam karena ada banyak konstelasi search'n'skip (seperti yang harus saya lakukan). Mungkin itu
prune
adalah teman Anda sementara-not -path
tidak akan melakukan apa yang Anda harapkan.Jadi ini adalah contoh berharga dari 15 menemukan contoh yang mengecualikan direktori:
http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html
Untuk menautkan ke pertanyaan awal, mengecualikan akhirnya berhasil untuk saya seperti ini:
Kemudian, jika Anda ingin menemukan satu file dan masih mengecualikan path, tambahkan saja
| grep myFile.txt
.Mungkin juga tergantung pada versi pencarian Anda. Saya melihat:
sumber
-name
hanya cocok dengan nama file, bukan seluruh jalur. Anda ingin menggunakan-path
sebagai gantinya, untuk bagian di mana Anda memangkas direktori sepertidef/incoming
.sumber
sumber
find ... -print0
bersama dengan nantixargs -0
Dengan mengikuti ini Bagaimana mengecualikan direktori di find. perintah :
sumber