คำสั่งค้นหา Linux - แสดงความคืบหน้า


24

findผมสงสัยว่าถ้ามีวิธีใดที่จะแสดงชนิดของข้อมูลความคืบหน้าเมื่อค้นหาไฟล์ในลินุกซ์ใช้ ฉันมักจะพบว่าตัวเองกำลังค้นหาไฟล์บนดิสก์ขนาดใหญ่และตัวบ่งชี้ความคืบหน้าบางอย่างจะเป็นประโยชน์อย่างมากเช่นแถบหรืออย่างน้อยไดเรกทอรีปัจจุบัน "ค้นหา" ค้นหามีสคริปต์ใด ๆ ที่ทำเช่นนั้นหรือfindสนับสนุนตะขอบางอย่าง ?


ขอบคุณสำหรับคำตอบฉันจะตรวจสอบการแก้ปัญหาทั้งหมดและตัดสินใจว่าอันไหนดีกว่า ถ้ามันขึ้นอยู่กับฉันฉันจะทำเครื่องหมายคำตอบทั้งหมดว่าเป็นที่ยอมรับ
Vlad Balmos

ขึ้นอยู่กับเกณฑ์การค้นหาที่คุณใช้ในการค้นหาซึ่งจะเร็วกว่าการค้นหา
B14D3

คำตอบ:


28

ด้วยเคล็ดลับนี้คุณสามารถดูโฟลเดอร์ปัจจุบัน - แต่ไม่มีแถบความคืบหน้า - ขออภัย

 watch readlink -f /proc/$(pidof find)/cwd

มันเท่ห์มาก ควรสังเกตว่าคุณต้องการสิทธิ์ผู้ใช้ขั้นสูงเพื่อเข้าถึง cwd ขอบคุณ!
Vlad Balmos

ทำงานได้อย่างสมบูรณ์แบบ
Jesse Glick

8

ยูทิลิตี้เล็ก ๆ ที่เรียกว่าpv (ไปป์วิว) อาจช่วยได้ จากการสรุปที่ยอดเยี่ยมโดย Peteris Krumins:

Pipe Viewer เป็นเครื่องมือที่ใช้เทอร์มินัลสำหรับตรวจสอบความคืบหน้าของข้อมูลผ่านไปป์ไลน์

คุณสามารถใช้ pv ได้หลายวิธี เมื่อเล่นที่นี่ฉันวางมันทันทีหลังจากที่ไพพ์เพื่อตรวจสอบความคืบหน้าของเอาต์พุตที่สร้างโดย find (ควรส่ง stdin ไปยัง stdout ที่ไม่ถูกแตะต้อง)

find / -mtime -1h | pv > /dev/null

ซึ่งจะแสดงผลลัพธ์แบบนี้:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(ฉันเปลี่ยนเส้นทาง stdout ไปที่ / dev / null เพื่อให้ฉันเห็นแถบความคืบหน้าในการดำเนินการโดยไม่มีการแสดงผลโดยสิ่งนี้ไม่ได้เป็นความตั้งใจของคุณในการค้นหาดังนั้นปรับให้เหมาะสม)

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

ลองเล่นรอบ ๆ และดูว่ามันใช้งานได้ตามที่คุณต้องการหรือไม่ อาหารสำหรับความคิดอย่างน้อย


แถบความคืบหน้านั้นจะแสดงอะไร ทั้งfindไม่pvทราบว่านานการค้นหาจะใช้เวลา ,, ดังนั้นพวกเขาจึงไม่สามารถคำนวณเปอร์เซ็นต์ ทั้งหมดที่เราเห็นในpvผลลัพธ์คือเวลาตั้งแต่การค้นหาเริ่มต้นขึ้น
minaev

สิ่งนี้ถูกต้อง ฉันคิดว่ามีเวทมนตร์เกิดขึ้นบางแห่งที่อนุญาตให้ pv ตรวจสอบความคืบหน้าของการสำรวจเส้นทาง (ซึ่งไม่ถูกต้อง) กำหนดอินพุตมาตรฐานในอัตราคงที่pvเพียงเลื่อนแถบความคืบหน้าด้วยความถี่คงที่ ลองyes | pv > /dev/nullสังเกตดู
tcdyl

1
+1 สำหรับโปรแกรมอรรถประโยชน์ที่ดี
Vlad Balmos

การตัดสินความก้าวหน้านั้นไม่สำคัญ แม้แต่เว็บเบราว์เซอร์ที่กำลังโหลดหน้าก็ไม่สามารถทำได้ ฉันเดาว่าเนื้อหาไฟล์คุณสามารถหารด้วยขนาดไฟล์ได้ แต่สำหรับ Unix stream คุณไม่ทราบว่าจำนวนข้อมูลทั้งหมดเป็นอย่างไรและเครื่องมือนี้มีความยืดหยุ่นสำหรับข้อมูล stream ทุกชนิดไม่ใช่แค่ไฟล์
Sridhar Sarnobat

7

ฉันค้นหาสิ่งนี้วันนี้และมาที่นี่ผ่าน Google ฉันพบการรันบน OS X มานานแล้วและดูเหมือนwatchไม่มีอยู่จริง ดังนั้นนี่คือทางออกอื่น:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = รายการไฟล์ที่เปิด
  • -Fn= เพียงแสดงชื่อไฟล์ / ไดเรกทอรี (นำหน้าด้วยอักขระ 'n' ให้ข้ามสิ่งนี้หากคุณต้องการlsofเอาต์พุตเต็ม
  • -a= บอกlsofให้แสดงเฉพาะบรรทัดที่ตรงกับเกณฑ์ทั้งหมด (โดยค่าเริ่มต้นจะแสดงบรรทัดที่ตรงกับเกณฑ์ใด ๆ )
  • -c find= แสดงไฟล์ / ไดเรกทอรีที่เปิดโดยกระบวนการที่มีชื่อfind(จริง ๆ แล้วกระบวนการที่ชื่อขึ้นต้นด้วยfindแต่เป็นกรณี ๆ ไปดังนั้นFinderจะไม่แสดงขึ้นมา)
  • -d cwd = แสดงบรรทัดที่มี FD (filescriptor) cwd (ไดเรกทอรีการทำงานปัจจุบัน)
  • +r 10 = แสดงเอาต์พุตทุก 10 วินาทีจนกระทั่งไม่พบไฟล์ที่เปิดอยู่ (การค้นหาเสร็จสิ้น)

สิ่งนี้จะแสดงว่าไดเรกทอรีfindกำลังประมวลผลทุก 10 วินาทีดังนั้นจึงควรให้ความคิดหากfindยังทำงานอยู่และมีความคืบหน้าเท่าไร


5

มีตัวอย่างของการค้นหาแบบคู่ขนานกับของในfind man findคุณสามารถใช้การตรวจสอบหลายรายการสำหรับทุกรายการโดยดำเนินการหลายการกระทำตามเงื่อนไขที่ใช้ ตัวอย่างเช่นการตรวจสอบครั้งแรกอาจเป็นเรื่องง่าย-printดังนั้นชื่อทั้งหมดจะถูกพิมพ์ไปยัง stdout การตรวจสอบครั้งที่สองจะทำในสิ่งที่คุณต้องการ สิ่งที่ต้องการ:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

-fprint /dev/stderrหากการตรวจสอบที่สองควรแสดงชื่อไฟล์เกินไปคุณสามารถเปลี่ยนเส้นทางหนึ่งของพวกเขาที่จะใช้ stderr


ฉันไม่ได้ทดสอบสิ่งนี้ แต่ฉันคิดว่าเป็นวิธีที่ถูกต้อง
Rolf

2

AFAIK มันไม่ได้และการใช้งานมันจะไม่น่าสนใจ

... อืม อาจเป็นสคริปต์ที่รันfind <target dir> -type dก่อนเก็บรายการแล้วสะท้อนแต่ละ dir ก่อนที่จะรัน a find <list item> -maxdepth 1 <rest of find parameters>ใน for for loop

โปรดทราบว่าคุณกำลังค้าขาย / สำคัญ / สูญเสียประสิทธิภาพเพื่อแลกกับความสามารถในการดูสิ่งที่กำลังทำ


1

นี่คือรายการของไฟล์ปัจจุบันที่เปิดโดยfindดังนั้นมันจึงเป็นสิ่งเดียวกันกับสิ่งที่ค้นหากำลังค้นหา 'ตอนนี้'

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

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

grep -v /dev/คือการซ่อนไฟล์ STDOUT, STDIN และ STDERR ที่มีไฟล์ที่ใช้ในการรับและการพิมพ์ข้อมูลบนคอนโซล

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