TLDR: अपनी रूट निर्देशिकाओं को समझें और -path <excluded_path> -prune -o
विकल्प का उपयोग करके अपनी खोज को वहां से दूर करें । /
बहिष्कृत पथ के अंत में एक अनुगामी शामिल न करें ।
उदाहरण:
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
प्रभावी ढंग से उपयोग करने के लिए find
मुझे विश्वास है कि आपकी फाइल सिस्टम निर्देशिका संरचना की अच्छी समझ होना लाजमी है। मेरे होम कंप्यूटर पर मेरे पास मल्टी-टीबी हार्ड ड्राइव है, जिसमें से लगभग आधी सामग्री का उपयोग करके बैकअप किया गया है rsnapshot
(यानी, rsync
)। हालाँकि एक शारीरिक रूप से स्वतंत्र (डुप्लिकेट) ड्राइव के लिए बैक अप, यह मेरे सिस्टम रूट ( /
) निर्देशिका के तहत मुहिम की जाती है /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/
निर्देशिका वर्तमान में ~ साथ 60M फ़ाइलों और फ़ोल्डरों, पर है ~ 2.9 टीबी; बस उन सामग्रियों का पता लगाने में समय लगता है:
## 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
इस प्रकार, कभी-कभी मुझे अपने /
(रूट) विभाजन पर एक फ़ाइल की तलाश करने की आवश्यकता होती है, मुझे अपने बैकअप विभाजन को ट्रेस करने (यदि संभव हो तो) से बचने की आवश्यकता है।
उदाहरण
इस सूत्र में सुझाए गए विभिन्न तरीकों में से ( खोज में कमांड को बाहर करने का तरीका ), मुझे लगता है कि स्वीकृत उत्तर का उपयोग करने वाली खोजें बहुत हैं तेजी से होती हैं - कैविटीज़ के साथ।
समाधान 1
मान लीजिए कि मैं सिस्टम फ़ाइल ढूंढना चाहता हूं libname-server-2.a
, लेकिन मैं अपने rsnapshot
बैकअप के माध्यम से खोज नहीं करना चाहता । जल्दी से एक प्रणाली फ़ाइल ढूंढने के लिए, पथ को बाहर का उपयोग /mnt
(यानी, उपयोग /mnt
, नहीं /mnt/
, या /mnt/Backups
, या ...):
## 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!
... बस कुछ ही सेकंड में उस फ़ाइल को ढूँढता है, जबकि यह बहुत अधिक समय लेता है ("अपवर्जित निर्देशिका" के सभी के माध्यम से पुन: प्राप्त करने के लिए प्रकट होता है:
## 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
समाधान २
इस सूत्र में प्रस्तुत अन्य समाधान ( SO # 4210042 ) भी खराब प्रदर्शन करता है:
## 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
सारांश | निष्कर्ष
" समाधान 1 " में चित्रित दृष्टिकोण का उपयोग करें
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
अर्थात
... -path <excluded_path> -prune -o ...
यह देखते हुए कि जब भी आप अनुगामी /
पथ में अनुगामी जोड़ते हैं , find
तब कमांड पुनरावर्ती रूप से (उन सभी) /mnt/*
निर्देशिकाओं में प्रवेश करती है - जो कि मेरे मामले में, /mnt/Backups/rsnapshot_backups/*
उपनिर्देशिकाओं के कारण, इसके अलावा ~ 2.9 टीबी फ़ाइलों की खोज भी शामिल है! अनुगामी न जोड़कर/
खोज को लगभग तुरंत (सेकंड के भीतर) पूरा करना चाहिए।
"समाधान 2" ( ... -not -path <exclude path> ...
) इसी तरह अपवर्जित निर्देशिकाओं के माध्यम से पुन: खोज करने के लिए प्रकट होता है - अपवर्जित मैचों को नहीं लौटाता है, लेकिन अनावश्यक रूप से उस खोज समय का उपभोग करता है।
उन के भीतर खोज rsnapshot
बैकअप के :
मेरे प्रति घंटा / दैनिक / साप्ताहिक / मासिक rsnapshot
बैकअप में से एक में फ़ाइल खोजने के लिए ):
$ 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)
एक नेस्टेड निर्देशिका को छोड़कर:
यहाँ, मैं एक नेस्टेड निर्देशिका, जैसे बाहर करना चाहते हैं /mnt/Vancouver/projects/ie/claws/data/*
जब से खोज /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
एक तरफ:-print
कमांड के अंत में जोड़ने से बाहर की निर्देशिका के प्रिंटआउट को दबा दिया जाता है:
$ 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