Saya menggunakan find
untuk mencari dan menghapus file cadangan tetapi ingin mengecualikan direktori tertentu dari pencarian. Nama file backup bisa berhenti dalam .bck
, bak
, ~
, atau backup
.
Kode Minimal Working Example (MWE) dengan hanya tiga direktori untuk dikecualikan adalah:
#! /bin/bash
find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
Sintaksnya \( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
tampak agak kikuk, terutama jika ada sekitar sepuluh direktori yang harus dikecualikan, meskipun saya telah menunjukkan hanya tiga di MWE.
Apakah ada cara yang lebih elegan menggunakan file input, dengan daftar direktori yang dikecualikan, atau susunan array atau daftar, yang dapat ditekan ke dalam layanan?
Saya minta maaf karena tidak lebih eksplisit ketika saya menulis pertanyaan asli saya.
NB: trash-put
adalah utilitas yang memindahkan file ke Trashcan
bukan menghapusnya [1].
Dengan GNU find (yaitu di bawah Linux atau Cygwin yang tidak tertanam), Anda dapat menggunakan
-regex
untuk menggabungkan semua-path
wildcard ini menjadi satu regex tunggal.Dengan FreeBSD atau OSX, gunakan
-E
sebagai ganti-regextype posix-extended
.sumber
Kelompokkan
-path ... -prune
ke dalam satu ekspresi yang diapit dengan\( ... \)
menggunakan-o
( atau ) logika.Contoh akan direktori tidak iterate atau file pada atau di bawah
/somepath/a
,/somepath/b
dan/somepath/c
.Berikut adalah contoh yang lebih spesifik menggunakan beberapa tindakan.
sumber
Ini tampaknya lebih merupakan pertanyaan shell daripada
find
pertanyaan. Dengan file yang mengandung( -name dir1 -o -name dir2 ) -prune
(no "\"!) Anda cukup melakukan ini:Tanpa mengubah panggilan penemuan itu sendiri (ke
eval find
atau dengan mengubah $ IFS) ini berfungsi dengan jalur tanpa spasi putih saja.Jika Anda ingin membuat file lebih sederhana, Anda dapat menulis skrip.
Dan gunakan
sebagai gantinya.
sumber
-name
olehpath
).\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
mengecualikan direktori tertentu dari pencarian rekursiffind
. Saya tidak mencari apa pun di dalam file melainkan menghapus file tertentu dan menghindari direktori tertentu di jalur pencarian saya. Saya juga tidak mengerti apa yang sedang dilakukan skrip Anda. Jadi, sepertinya kita memiliki miskomunikasi. Maaf. Mari kita berhenti di situ.