TLDR:เข้าใจไดเรกทอรีรูทของคุณและปรับแต่งการค้นหาของคุณจากตรงนั้นโดยใช้-path <excluded_path> -prune -o
ตัวเลือก อย่ารวมส่วนท้าย/
ที่ส่วนท้ายของเส้นทางที่ถูกแยก
ตัวอย่าง:
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
เพื่อใช้อย่างมีประสิทธิภาพfind
ฉันเชื่อว่ามันเป็นสิ่งจำเป็นที่จะมีความเข้าใจที่ดีของโครงสร้างไดเรกทอรีระบบไฟล์ของคุณ ในคอมพิวเตอร์ที่บ้านของฉันฉันมีฮาร์ดไดรฟ์หลาย TB โดยประมาณครึ่งหนึ่งของเนื้อหานั้นสำรองโดยใช้rsnapshot
(เช่นrsync
) แม้ว่าจะสำรองข้อมูลไปยังไดรฟ์ (ซ้ำ) ที่เป็นอิสระทางกายภาพ แต่จะถูกเมาท์ภายใต้/
ไดเรกทอรีsystem root ( ) ของฉัน/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/
ไดเรกทอรีปัจจุบันมี ~ 2.9 TB ด้วย ~ ไฟล์และโฟลเดอร์ 60M; เพียงแค่สำรวจเนื้อหาเหล่านั้นต้องใช้เวลา:
## 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
ดังนั้นเมื่อใดก็ตามที่ฉันต้องการค้นหาไฟล์บน/
พาร์ติชั่น (root) ของฉันฉันต้องจัดการกับ (หลีกเลี่ยงถ้าเป็นไปได้) ภายในการสำรองข้อมูลพาร์ติชันของฉัน
ตัวอย่าง
ในบรรดาคำแนะนำที่ได้รับการแนะนำต่าง ๆ ในเธรดนี้ ( วิธีการแยกไดเรกทอรีในคำสั่ง find. ) ฉันพบว่าการค้นหาที่ใช้คำตอบที่ยอมรับนั้นเร็วกว่ามาก - ด้วยคำเตือน
โซลูชันที่ 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
โซลูชันที่ 2
โซลูชันอื่นที่นำเสนอในเธรดนี้ ( 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 TB! โดยไม่ผนวกท้าย/
การค้นหาควรจะเสร็จสมบูรณ์เกือบจะในทันที (ภายในไม่กี่วินาที)
"โซลูชัน 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