จะแสดงขนาดไฟล์ "ที่มนุษย์อ่านได้" ในผลลัพธ์การค้นหาได้อย่างไร


11

ฉันพยายามค้นหาไฟล์ขนาดใหญ่ทั้งหมดบนเซิร์ฟเวอร์ Centos ของฉัน ในการทำเช่นนั้นฉันกำลังใช้:

find / -maxdepth 10 -size +100000 -ls

ฉันลองเปลี่ยน-lsเป็น-lshแต่ไม่ได้รับอนุญาต

ฉันจะแสดงผลลัพธ์เหล่านี้ด้วยขนาดที่มนุษย์อ่านได้ (โดยใช้คำต่อท้าย k, M, …) อย่างไร


คำจำกัดความของคุณที่มนุษย์อ่านได้คืออะไร? สำหรับฉันนั่นเป็นมนุษย์ที่อ่านได้พอสมควร
จัดการ

คุณควรพยายามยูทิลิตี้file find
Ramesh

@ manatwork kb, mb, gb
พูดจาโผงผาง

คำตอบ:


10

findlsไม่ได้มีตัวเลือกที่มีความซับซ้อนเช่น ถ้าคุณต้องการคุณจำเป็นต้องเรียกls -hls

find / -maxdepth 10 -size +100000 -exec ls -lh {} +

ฉันแนะนำ-xdevตัวเลือกให้หลีกเลี่ยงการเรียกใช้ซ้ำในระบบไฟล์อื่นซึ่งจะไม่มีประโยชน์หากคุณกังวลเกี่ยวกับพื้นที่ดิสก์

find / -xdev -maxdepth 10 -size +100000 -exec ls -lh {} +

หากคุณใช้ zsh เป็นเปลือกของคุณแทนที่จะใช้findคุณสามารถใช้โปรแกรมระบุคุณสมบัติแบบกลม การ จำกัด ขนาดไฟล์นั้นง่าย: Lตามด้วยขนาด ขนาดสามารถมีหน่วยเสริมก่อนหมายเลข หากคุณไม่สนใจเกี่ยวกับความลึกสูงสุดคุณสามารถใช้**/เพื่อชดเชยในไดเรกทอรีย่อย หากคุณสนใจเกี่ยวกับความลึกสูงสุดก็ยุ่งยากมากขึ้นเป็นรูปแบบ glob zsh ขาดวิธีการแสดง“ที่มากที่สุดnเกิดขึ้น” เพื่อหลีกเลี่ยงการเรียกซ้ำข้ามอุปกรณ์ให้ใช้ตัวระบุแบบdกลม คุณจำเป็นต้องค้นหาหมายเลขอุปกรณ์ซึ่งคุณสามารถแสดงด้วยstatคำสั่งภายใต้ Linux ( stat -c %d /เพื่อแสดงเฉพาะหมายเลข) หรือด้วยstatbuiltin ของ zsh (เรียกใช้zmodload zsh/statเพื่อโหลด)

ls -lh /**/*(L+M99d$(stat -c %d /))

4

คำสั่งที่คุณพยายามนั้นสามารถอ่านได้สำหรับฉัน อย่างไรก็ตามคุณสามารถใช้ยูทิลิตีไฟล์พร้อมกับค้นหาดังนี้

find / -maxdepth 10 -size +100000 -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print

อีกวิธีในการทำเช่นนี้คือการใช้คำสั่งด้านล่าง

du -BM / | sort -nr

คำสั่งดังกล่าวจะให้ไฟล์ในขนาดไฟล์ที่เรียงลำดับ

หากคุณใช้coreutils> 7.5คุณสามารถใช้คำสั่งด้านล่างเพื่อแสดงรายการไฟล์ตามขนาด

du -ah / | grep -v "/$" | sort -h

ในเครื่องของฉันฉันไม่มีsort -hตัวเลือกที่ใช้ได้

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

du -BM /home/ramesh/chk1/ | sort -nr

50M     /home/ramesh/chk1/
21M     /home/ramesh/chk1/Hierarchical_Clustering_Working
3M      /home/ramesh/chk1/checking_files
1M      /home/ramesh/chk1/checking/checking2
1M      /home/ramesh/chk1/checking/checking1
1M      /home/ramesh/chk1/checking/asdf
1M      /home/ramesh/chk1/checking

มีวิธีตั้งวงเงินต่ำกว่าในคำสั่งที่สองของคุณหรือไม่? ไฟล์ที่ใหญ่ที่สุดปรากฏขึ้นที่ด้านบนและหายไปอย่างรวดเร็วจากด้านบนของเปลือกแก้ไข - ฉันเห็นคุณเพียงแค่ต้องลบ r
blarg

คุณสามารถเปลี่ยนทิศทางเอาต์พุตไปยังไฟล์โดยเพิ่ม> outputไปที่คำสั่ง จากนั้นคุณสามารถเปิดไฟล์และดูผลลัพธ์ตามที่คุณต้องการ :)
ราเมษ

ฉันเห็นนี้โฟลเดอร์แสดงมากเกินไปในขณะที่ฉันเท่านั้นหลังจากที่ไฟล์
blarg

du -a --max-depth=10 / | sort -rnคือใกล้ที่ฉันจะเกิดขึ้นกับ อย่างไรก็ตามในกรณีนี้มันจะไม่แสดงขนาดเป็น KB, MB หรือ GB
Ramesh

1

ฉันคิดว่าสิ่งที่คุณหลังจากนั้นเป็นเหมือนดังต่อไปนี้

find / -maxdepth 10 -size +100000 -exec ls -lah {} + 

-execช่วยให้คุณสามารถรันคำสั่งและ{}ถูกแทนที่ด้วยผลการค้นหาที่ สุดท้าย+คือการบอก find มันเป็นจุดสิ้นสุดของคำสั่งและจำเป็นต้องมี


2
อันที่จริงแล้วมันไม่จำเป็นเลยที่จะเสนอราคาที่{}นี่ เครื่องหมายคำพูดเดี่ยวในคำสั่งนั้นใช้สำหรับเชลล์ แต่เชลล์ไม่เคยเห็นls -lah <args...>คำสั่งเลย - มันเห็น{}ซึ่งไม่จำเป็นต้องอ้างถึง มันคือfindสิ่งที่เห็นls -lah {}และเป็นfindตัวขยาย{}และตามนัยโดยชื่อของ-execตัวเลือกfindใช้การexec*เรียกระบบบนอาร์กิวเมนต์โดยตรงดังนั้นจะไม่มีปัญหาใด ๆ กับช่องว่างเพราะfindจะไม่ทำการแยกคำ ในชื่อไฟล์ของคุณ
jw013

1
-aตัวเลือกที่จะlsไม่จำเป็นตั้งแต่การขัดแย้งที่คาดว่าจะเป็นไฟล์และไดเรกทอรีไม่ GNU ใช้ค้นหาls -dilsสำหรับตัวเลือกเพื่อที่จะทำซ้ำที่ใกล้ชิดมากที่สุดก็จะเป็น-ls ls -dilsh
jw013

man findให้สิ่งต่อไปนี้เป็นตัวอย่างแรกของการใช้-exec : find . -type f -exec file '{}' \; เรียกใช้ไฟล์บนทุกไฟล์ในหรือต่ำกว่าไดเรกทอรีปัจจุบัน ขอให้สังเกตว่าเครื่องหมายวงเล็บอยู่ในเครื่องหมายอัญประกาศเดี่ยวเพื่อป้องกันการตีความเป็นเครื่องหมายวรรคตอนของเชลล์สคริปต์ เครื่องหมายอัฒภาคได้รับการป้องกันในทำนองเดียวกันโดยใช้เครื่องหมายแบ็กสแลช แต่สามารถใช้เครื่องหมายคำพูดเดี่ยวในกรณีนั้นได้
Tim Hughes

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