ค้นหาและค้นหา


30

มีคำสั่งfindและlocateเพื่อค้นหาไฟล์บนดิสก์

ฉันรู้ว่าการfindประมวลผลไดเรกทอรีย่อยที่จำเป็นทั้งหมดเพื่อค้นหาไฟล์ซ้ำดังนั้นจึงช้า แต่ทันสมัยในขณะที่locateใช้ฐานข้อมูลที่ได้รับการปรับปรุงทุกขณะนี้ (เมื่อ?) เพื่อแสดงผลลัพธ์ที่อาจล้าสมัยอย่างรวดเร็ว

มีความแตกต่างอื่น ๆ อีกไหม? ในสถานการณ์ใดที่หนึ่งจะชอบหนึ่งหรืออื่น ๆ ? และเมื่อใดที่locateฐานข้อมูลจะได้รับการอัปเดตตามปกติ


7
การอ้างอิง: unix.stackexchange.com/questions/60205/…
Rinzwind

1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html "โดยปกติ updatedb จะทำงานทุกวันโดย cron (8) เพื่ออัปเดตฐานข้อมูลเริ่มต้น"
Rinzwind

@Rinzwind คำตอบ U&L ที่เชื่อมโยงนั้นยอดเยี่ยมมันน่าละอายที่เราไม่สามารถทำซ้ำข้ามไซต์ได้ แต่คุณรู้เพิ่มเติมเกี่ยวกับ cronjob หรือไม่ หลังจากเริ่มทำงาน ในเวลาที่ระบุ (ฉันคิดว่าฉันอ่าน 1-2AM หรืออะไรทำนองนั้น) เท่านั้น? จะเกิดอะไรขึ้นถ้ามันถูกปิดในเวลานั้น? มันเริ่มต้นเมื่อคอมพิวเตอร์ไม่มีการใช้งานหรือไม่? ฉันจะดูอายุของฐานข้อมูลได้อย่างไร
ผู้บัญชาการไบต์

2
@ ByteCommander - นั่นคือสิ่งที่anacronมีไว้เพื่อ ฉันไม่รู้ว่าติดตั้งโดยค่าเริ่มต้นในระบบเดสก์ท็อป / เซิร์ฟเวอร์ แต่อยู่ในโน้ตบุ๊ก มันรันเมื่อบู๊ตเครื่องและดูว่างาน cron ใดที่ควรรันในขณะที่ระบบปิดอยู่และรันมัน มันมีประโยชน์จริง ๆ แต่อาจทำให้เกิดปัญหาบางอย่างหากคุณมีงานที่กำหนดห่างจากเที่ยงคืน ที่สามารถทำให้งานถูกเรียกใช้เมื่อเริ่มระบบและอีกครั้งเมื่อเวลามา - อาจน้อยกว่า 24 ชั่วโมงต่อมา (สำหรับงานประจำวัน)
Joe

@ Joe ดังนั้นมันจะทำงานในระหว่างการบูทและทำให้ช้าลงหรือจะรันในเวลาหลังจากการบู๊ตหรือมันมักจะรันด้วยความสำคัญต่ำที่มันจะทำงานเมื่อระบบเกือบจะว่าง?
ผู้บัญชาการไบต์

คำตอบ:


27

locateมันดีสำหรับการค้นหาไฟล์และแสดงมันต่อมนุษย์เท่านั้น คุณสามารถทำบางสิ่งกับมันได้ แต่ฉันจะไม่เชื่อใจมันมากพอที่จะแยกวิเคราะห์และ - คุณบอกว่า - เป็นไปไม่ได้ที่จะรับประกันสถานะของฐานข้อมูลภายในมากขึ้นเพราะมันมีกำหนดให้ทำงาน/etc/cron.daily/mlocateเท่านั้นวันละครั้ง!

findกำลังถ่ายทอดสด มันกรองยกเว้นดำเนินการ เหมาะสำหรับการแยกวิเคราะห์ มันสามารถออกเส้นทางสัมพัทธ์ มันสามารถออกเส้นทางเต็ม มันสามารถทำสิ่งต่าง ๆ ตามคุณลักษณะไม่ใช่แค่ชื่อ

locateแน่นอนมีสถานที่ในกล่องเครื่องมือของฉัน แต่มักจะอยู่ที่ด้านล่างเป็นความพยายามครั้งสุดท้ายเพื่อค้นหาบางสิ่งบางอย่าง มันง่ายกว่าfindเช่นกัน


2
ฉันพบว่าlocateจะเร็วขึ้นมากถ้าฉันต้องการค้นหาทั้งระบบไฟล์ของฉัน และคุณสามารถอัปเดตฐานข้อมูลด้วยตนเองupdatedbก่อนใช้งานได้
hytromo

คุณรู้หรือไม่ว่า cronjob นั้นได้รับการกำหนดค่าอย่างแน่นอน? มันทำงานในเวลาที่กำหนดหรือเมื่อระบบอยู่ในสถานะไม่ได้ใช้งานหรือ n นาทีหลังจากเริ่มทำงาน เพราะฉันคิดว่าฉันได้อ่านที่ไหนซักแห่งที่มีกำหนดเวลา 1-2AM เมื่อเครื่องของฉันถูกปิด จะไม่ได้รับการอัปเดตยกเว้นด้วยตนเอง ( sudo updatedb) หรือไม่ และมีโอกาสดูว่าฐานข้อมูลเก่าหรือไม่
ผู้บัญชาการไบต์

grep run-parts /etc/crontabคุณจะเห็นว่าสิ่งเหล่านี้มีการจัดการผ่านanacron(ซึ่งคุณจะเห็นผ่านman anacronมีความยืดหยุ่นมากขึ้นกับระบบที่ไม่ได้อยู่ตลอดเวลา) จากสิ่งที่ฉันเห็นมันควรรันในการบู๊ตแทนหากคุณพลาดเวลา cron ดั้งเดิม
Oli

2
ฉันพบว่าการค้นหานั้นไม่ได้จัดทำดัชนีพาร์ติชันที่ถอดออกได้ / ไม่เมานต์ของฉันดังนั้นถ้าฉันต้องการค้นหาบางสิ่งในนั้นฉันต้องใช้การค้นหา แน่นอนการค้นหาไม่ได้มีตัวเลือกที่น่าทึ่งทั้งหมดที่พบไม่ต้องการ-exec command {} \;เรียกใช้คำสั่งในทุกไฟล์ที่พบ ฉันชอบที่จะใช้locate -bจำกัด การค้นหาเพื่อค้นหาไฟล์ที่ตรงกับองค์ประกอบสุดท้ายของชื่อ - โดยไม่ต้องส่วนที่เหลือของเส้นทาง ฉันมักจะลองก่อนเพราะมันเร็วมาก นอกจากนี้คุณสามารถเรียกใช้sudo updatedbทุกครั้งที่คุณต้องการรีเฟรชฐานข้อมูลการค้นหา
Joe

หากคุณต้องการการค้นหาตามเวลาจริงที่ค่อนข้างง่ายคุณสามารถใช้สิ่งที่ต้องการls -R | grep 'file_name.txt'
jena

8

เท่าที่ฉันชอบ Oli (ซึ่งเป็นจำนวนมาก!) ฉันไม่เห็นด้วยกับเขาในfindคำสั่ง ฉันไม่ชอบมัน

find คำสั่งใช้เวลาสามนาที

ยกตัวอย่างคำสั่งง่ายๆนี้:

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

มันต้องใช้เวลากว่าสามนาทีสำหรับการค้นหาทุกอย่างเริ่มต้นจากfind /โดยค่าเริ่มต้นรีมของข้อความแสดงข้อผิดพลาดปรากฏขึ้นและคุณต้องค้นหาผ่านพวกเขาเพื่อค้นหาสิ่งที่คุณกำลังมองหา ยังดีกว่าgrepการค้นหาทั้งไดรฟ์สำหรับสตริงที่ใช้เวลา53 ชั่วโมง : `grep`ing ไฟล์ทั้งหมดสำหรับสตริงใช้เวลานาน

ฉันรู้ว่าฉันสามารถเล่นกับพารามิเตอร์ของคำสั่ง find เพื่อให้ทำงานได้ดีขึ้น แต่ประเด็นที่นี่คือระยะเวลาที่ใช้ในการรัน

locate คำสั่งใช้เวลาน้อยกว่าหนึ่งวินาที

ตอนนี้มาใช้locate:

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

ค้นหาคำสั่งใช้เวลาน้อยกว่าสอง!

updatedb เริ่มต้นวันละครั้งเท่านั้น

เป็นจริงupdatedbคำสั่งที่อัพเดตฐานข้อมูลค้นหาจะรันเพียงวันละครั้งโดยค่าเริ่มต้น คุณสามารถรันด้วยตนเองก่อนค้นหาไฟล์ที่เพิ่มโดยใช้:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

แม้ว่าจะใช้เวลา 3 วินาที แต่ก็เล็กเมื่อเทียบกับfind3+ นาทีของคำสั่ง

ฉันได้อัปเดตsudo crontab -eเพื่อรวมบรรทัดที่ด้านล่าง:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

ตอนนี้ทุก ๆ ห้านาทีupdatedbจะรันและlocateฐานข้อมูลคำสั่งเกือบจะเป็นข้อมูลล่าสุดเสมอ

แต่ไม่มีคุณสมบัติหรือไม่

คุณสามารถไพพ์locateเอาต์พุตไปยังคำสั่งอื่น ตัวอย่างเช่นหากคุณต้องการคุณลักษณะของไฟล์คุณสามารถใช้:

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

สรุป

locateผมโพสต์คำตอบนี้จะแสดงความเร็วและความสะดวกในการใช้งานของ ฉันพยายามพูดสั้น ๆ เกี่ยวกับคำสั่งของคนอื่นที่ชี้ให้เห็น

findคำสั่งต้องมีการสำรวจโครงสร้างไดเรกทอรีทั้งหมดเพื่อหาไฟล์ locateคำสั่งมีฐานข้อมูลเป็นของตัวเองซึ่งจะทำให้มันฟ้าผ่าความเร็วในการเปรียบเทียบ


@EliahKagan แต่คำสั่ง find กำลังเลื่อนดูและแสดงรายการไดเรกทอรีและไฟล์ทั้งหมดในไดรฟ์ทั้งหมดที่มีพาร์ติชัน ดูเหมือนว่าจะใช้งานได้และฉันคาดหวังว่าจะพิมพ์ออกมาในตอนท้าย ... ไม่ว่าจะด้วยวิธีใด "แก้ไข" การค้นหาคำสั่ง find มันเกี่ยวกับการทำให้เวลา การรันlocate / display-auto-brightnessใช้เวลา 17 วินาทีและยังแสดงทุกไดเรกทอรีและไฟล์ในดิสก์ทั้งหมด
WinEunuuchs2Unix

@EliahKagan ฉันเข้าใจ --regexจำเป็นเพราะมีผลลัพธ์จำนวนมากส่งคืนมาพร้อมสตริงการค้นหาของฉัน ฉันจะหาตัวอย่างใหม่สองตัวอย่างเพื่อค้นหาและค้นหาและอัปเดตคำตอบของฉันในไม่กี่นาที
WinEunuuchs2Unix

1
เพื่อชี้แจงประเด็นของ Eliah findคำสั่งนั้นหมายถึง"พิมพ์ชื่อไฟล์ของไฟล์ทั้งหมดในไดเรกทอรี/และdisplay-auto-brightness" ฉันคิดว่าคุณตั้งใจจะใช้find / -name display-auto-brightnessแต่ถึงแม้จะพิมพ์ข้อผิดพลาด "การอนุญาตที่ปฏิเสธ" ขยะจำนวนมาก
wjandrea

@wjandrea ใช่เพราะฉันบอกว่าจุดนั้นไม่สามารถหาไฟล์ได้มันเป็นเวลาที่คำสั่ง find ตอนนี้ฉันทำการทดสอบอีกครั้งด้วยพารามิเตอร์ที่ถูกต้องหลังจากล้างแคช จากนั้นฉันจะอัปเดตคำตอบ
WinEunuuchs2Unix

1
@ ไม่เช่นนั้นตัวอย่างของคุณยังใช้งานได้และฉันไม่คิดว่าเวลาในการประมวลผลจะเปลี่ยนแปลงไปมากเพียงใดหากพบไฟล์หรือไม่
wjandrea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.