Kecualikan sub-direktori menggunakan find

115

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

Ravi
sumber
3
Ini bukan nasihat yang baik, tetapi ini akan membuat Anda keluar dari banyak situasi dengan cepat dan kotor: grep -v somethinggunakan pipa untuk mengecualikan apa pun yang tidak Anda inginkan
Miquel
Apakah ini menjawab pertanyaan Anda? Bagaimana cara mengecualikan direktori di find. perintah
imz - Ivan Zakharyaschev

Jawaban:

206

Ini bekerja:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"

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 dengan def/incomingsebagai bagian dari jalurnya
  • -not -path "*456/incoming*": jangan menyertakan apa pun dengan 456/incomingsebagai bagian dari jalurnya
sampson-chen
sumber
mendapatkan kesalahan "temukan: opsi buruk -tidak menemukan: daftar-jalur predikat-daftar"
Ravi
@Ravi Apakah Anda menggunakan bash shell? Saya baru saja menguji ini di terminal saya dan berfungsi untuk saya. Coba salin dan tempel solusi sebagai gantinya jika Anda membuat modifikasi pada skrip Anda.
sampson-chen
Ini berfungsi, tetapi, daftar dirs bukan file di direktori tersebut.
Ravi
1
-pathcocok dengan seluruh string, jadi jika Anda melakukannya find ., maka -pathstring Anda harus./path/to/directory/*
Heath Borders
1
FYI -not -pathpasti akan berfungsi dalam contoh ini tetapi findmasih melakukan iterasi ke dalam struktur direktori dan menggunakan siklus cpu untuk mengulangi semua direktori / file tersebut. untuk mencegah finditerasi atas direktori / file tersebut (mungkin ada jutaan file di sana) maka Anda perlu menggunakan -prune( -pruneopsi ini sulit digunakan).
Trevor Boyd Smith
9

Hanya demi dokumentasi: Anda mungkin harus menggali lebih dalam karena ada banyak konstelasi search'n'skip (seperti yang harus saya lakukan). Mungkin itu pruneadalah teman Anda sementara -not -pathtidak 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:

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

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:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
peter_the_oak
sumber
5

-namehanya cocok dengan nama file, bukan seluruh jalur. Anda ingin menggunakan -pathsebagai gantinya, untuk bagian di mana Anda memangkas direktori seperti def/incoming.

Brian Campbell
sumber
2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"
Vishal Pathak
sumber
7
Beberapa penjelasan mungkin membuat ini menjadi jawaban yang jauh lebih baik.
Cris Luengo
Terima kasih atas cuplikan kode ini, yang mungkin memberikan beberapa bantuan jangka pendek terbatas. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah tersebut, dan akan membuatnya lebih berguna bagi pembaca di masa mendatang dengan pertanyaan serupa lainnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat
Shawn C.
1
Catatan: Trik ini tidak bekerja jika digunakan find ... -print0bersama dengan nantixargs -0
phs