টিএলডিআর: আপনার মূল ডিরেক্টরিগুলি বুঝতে এবং সেখান থেকে -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
সুতরাং, যে কোনও সময় আমার /
(মূল) পার্টিশনে কোনও ফাইল সন্ধান করা দরকার, আমার ব্যাকআপগুলি পার্টিশনটি অতিক্রম করে (সম্ভব হলে এড়ানো) মোকাবেলা করতে হবে।
উদাহরণ
এই থ্রেডে প্রস্তাবিত বিভিন্নভাবে যোগাযোগের মধ্যে ( কীভাবে একটি ডিরেক্টরিকে ফাইন্ড কমান্ডে বাদ দিতে হয় ), আমি দেখতে পেয়েছি যে গ্রহণযোগ্য উত্তর ব্যবহার করে অনুসন্ধানগুলি অনেক দ্রুত - ক্যাভ্যাট সহ।
সমাধান ঘ
ধরা যাক আমি সিস্টেম ফাইলটি খুঁজতে চাই 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!
... দেখে যে মাত্র কয়েক সেকেন্ডের মধ্যে ফাইল, 'এই নাও যখন অনেক লম্বা ( "বাদ" ডিরেক্টরি সব দিয়ে recurse উপস্থিত):
## 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
সমাধান 2
এই থ্রেডে প্রদত্ত অন্যান্য সমাধান ( এসও # 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