TLDR:-path <excluded_path> -prune -o
seçeneği kullanarak kök dizinlerinizi anlayın ve aramanızı oradan özelleştirin . Sondaki noktayı dahil etme/
Dışlanan yolun sonuna .
Misal:
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
Etkili bir şekilde kullanmak için find
ben dosya sistemi dizin yapısı hakkında iyi bir anlayış olması gerektiğine inanıyorum. Ev bilgisayarımda çoklu TB sabit disklerim var, içeriğin yaklaşık yarısı rsnapshot
(yani rsync
) kullanılarak yedekleniyor . Fiziksel olarak bağımsız (yinelenen) bir sürücüye yedeklense de, sistem root ( /
) dizinimin altına monte edilir /mnt/Backups/rsnapshot_backups/
::
/mnt/Backups/
└── rsnapshot_backups/
├── hourly.0/
├── hourly.1/
├── ...
├── daily.0/
├── daily.1/
├── ...
├── weekly.0/
├── weekly.1/
├── ...
├── monthly.0/
├── monthly.1/
└── ...
/mnt/Backups/rsnapshot_backups/
Dizin şu anda 60M dosya ve klasörler ~ ile ~ 2.9 TB kaplar; basitçe bu içerikleri taramak zaman alır:
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find /mnt/Backups/rsnapshot_backups | wc -l
60314138 ## 60.3M files, folders
34:07.30 ## 34 min
time du /mnt/Backups/rsnapshot_backups -d 0
3112240160 /mnt/Backups/rsnapshot_backups ## 3.1 TB
33:51.88 ## 34 min
time rsnapshot du ## << more accurate re: rsnapshot footprint
2.9T /mnt/Backups/rsnapshot_backups/hourly.0/
4.1G /mnt/Backups/rsnapshot_backups/hourly.1/
...
4.7G /mnt/Backups/rsnapshot_backups/weekly.3/
2.9T total ## 2.9 TB, per sudo rsnapshot du (more accurate)
2:34:54 ## 2 hr 35 min
Bu nedenle, /
(kök) bölümümde bir dosya aramam gerektiğinde, yedekler bölümümü geçerek (mümkünse kaçınmalıyım) uğraşmam gerekir.
ÖRNEKLER
Bu iş parçacığında önerilen çeşitli yaklaşımlar arasında ( find. Komutunda bir dizin nasıl hariç tutulur), kabul edilen yanıtı kullanan aramaların çok daha hızlı olduğunu görüyorum - uyarılar.
Çözüm 1
Diyelim ki sistem dosyasını bulmak istiyorum libname-server-2.a
, ancak rsnapshot
yedeklemelerimi aramak istemiyorum . Hızlı bir sistem dosyasını bulmak için, yol hariç kullanmak /mnt
(yani kullanım /mnt
değil /mnt/
, ya /mnt/Backups
, ya ...):
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
real 0m8.644s ## 8.6 sec <<< NOTE!
user 0m1.669s
sys 0m2.466s
## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:
$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o \
-name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 3 sec ## ~3 sec <<< NOTE!
... bu dosyayı birkaç saniye içinde bulur, ancak bu işlem çok daha uzun sürer (tüm "hariç tutulan" dizinlerde yineleniyor gibi görünür):
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -path /mnt/ -prune -o -name "*libname-server-2.a*" -print
find: warning: -path /mnt/ will not match anything because it ends with /.
/usr/lib/libname-server-2.a
real 33m10.658s ## 33 min 11 sec (~231-663x slower!)
user 1m43.142s
sys 2m22.666s
## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:
$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt/ -prune -o \
-name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 1775 sec ## 29.6 min
Çözüm 2
Bu konuda sunulan diğer çözüm ( SO # 4210042 ) de kötü bir performans sergiliyor:
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -name "*libname-server-2.a*" -not -path "/mnt"
/usr/lib/libname-server-2.a
real 33m37.911s ## 33 min 38 sec (~235x slower)
user 1m45.134s
sys 2m31.846s
time find / -name "*libname-server-2.a*" -not -path "/mnt/*"
/usr/lib/libname-server-2.a
real 33m11.208s ## 33 min 11 sec
user 1m22.185s
sys 2m29.962s
ÖZET | SONUÇLAR
" Çözüm 1 " de gösterilen yaklaşımı kullanın
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
yani
... -path <excluded_path> -prune -o ...
izleyenleri /
hariç tutulan yola eklediğinizde, find
komut daha sonra (tüm bu) /mnt/*
dizinlere özyineli olarak girer - ki bu durumda, /mnt/Backups/rsnapshot_backups/*
alt dizinler nedeniyle ek olarak aramak için ~ 2.9 TB dosya içerir! Bir iz ekleyemediğinizde /
, arama neredeyse anında (saniyeler içinde) tamamlanmalıdır.
"Çözüm 2" ( ... -not -path <exclude path> ...
) de, hariç tutulan dizinler arasında özyineli olarak arama yapıyor gibi görünüyor - hariç tutulan eşleşmeleri döndürmüyor, ancak bu arama süresini gereksiz yere tüketiyor.
Bu rsnapshot
yedekler içinde arama :
Saatlik / günlük / haftalık / aylık rsnapshot
yedeklemelerimden birinde dosya bulmak için ):
$ START="$(date +"%s")" && find 2>/dev/null /mnt/Backups/rsnapshot_backups/daily.0 -name '*04t8ugijrlkj.jpg'; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/mnt/Backups/rsnapshot_backups/daily.0/snapshot_root/mnt/Vancouver/temp/04t8ugijrlkj.jpg
find command took 312 sec ## 5.2 minutes: despite apparent rsnapshot size
## (~4 GB), it is in fact searching through ~2.9 TB)
Yuvalanmış bir dizini hariç tutma:
Burada, örneğin /mnt/Vancouver/projects/ie/claws/data/*
arama yaparken iç içe bir dizini hariç tutmak istiyorum /mnt/Vancouver/projects/
:
$ time find . -iname '*test_file*'
./ie/claws/data/test_file
./ie/claws/test_file
0:01.97
$ time find . -path '*/data' -prune -o -iname '*test_file*' -print
./ie/claws/test_file
0:00.07
Kenara:-print
Komutun sonuna eklemek , hariç tutulan dizinin çıktısını bastırır:
$ find / -path /mnt -prune -o -name "*libname-server-2.a*"
/mnt
/usr/lib/libname-server-2.a
$ find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a