การนับไฟล์ซ้ำในไดเรกทอรี Linux


728

ฉันจะนับซ้ำไฟล์ในไดเรกทอรี Linux ได้อย่างไร

ฉันพบสิ่งนี้:

find DIR_NAME -type f ¦ wc -l

แต่เมื่อฉันเรียกใช้มันกลับข้อผิดพลาดต่อไปนี้

ค้นหา: พา ธ ต้องนำหน้านิพจน์: ¦


64
คุณมีความสับสนแถบเสีย¦(ASCII 166) กับแถบแนวตั้ง|(ASCII 124) ใช้สำหรับท่อยูนิกซ์
Skippy le Grand Gourou

7
@SkippyleGrandGourou มันไม่ได้เรียกว่าไปป์เหรอ?
DaveStephens

27
@DaveStephens ใช่มันเรียกอีกอย่างว่า มันเรียกอีกอย่างว่า Sheffer stroke, verti-bar, vbar, stick, เส้นแนวตั้ง, สแลชแนวตั้ง, แถบ, obelisk, glidus
emlai

64
@zenith ฉันเพิ่งเรียกมันว่าบ็อบ
Christopher

15
ใน RFC20 เรียกว่า "เส้นแนวตั้ง" "Pipe" เป็นชื่อของตัวดำเนินการเชลล์มากกว่าชื่อของสัญลักษณ์ เช่นเดียว*กับอักขระ ASCII "เครื่องหมายดอกจัน" แต่ "คูณ" ในบริบทอื่น ๆ
ผอม

คำตอบ:


1326

สิ่งนี้น่าจะใช้ได้:

find DIR_NAME -type f | wc -l

คำอธิบาย:

  • -type f เพื่อรวมไฟล์เท่านั้น
  • |( และไม่ใช่¦ ) เปลี่ยนทิศทางfindเอาต์พุตwcมาตรฐานของคำสั่งไปยังอินพุตมาตรฐานของคำสั่ง
  • wc(ย่อมาจากการนับจำนวนคำ) นับบรรทัดใหม่คำและไบต์บนอินพุต ( docs )
  • -l เพื่อนับแค่บรรทัดใหม่

หมายเหตุ:

  • แทนที่DIR_NAMEด้วย.เพื่อรันคำสั่งในโฟลเดอร์ปัจจุบัน
  • คุณยังสามารถลบ-type fไดเรกทอรีที่จะรวม (และ symlink) ในการนับ
  • เป็นไปได้ว่าคำสั่งนี้จะ overcount ถ้าชื่อไฟล์สามารถมีอักขระขึ้นบรรทัดใหม่

คำอธิบายว่าทำไมตัวอย่างของคุณถึงไม่ทำงาน:

ในคำสั่งที่คุณแสดงคุณไม่ได้ใช้ "Pipe" ( |) เพื่อเชื่อมต่อสองคำสั่ง แต่แถบที่แตก ( ¦) ซึ่งเชลล์ไม่รู้จักว่าเป็นคำสั่งหรือสิ่งที่คล้ายกัน นั่นเป็นเหตุผลที่คุณได้รับข้อความแสดงข้อผิดพลาด


27
fใน-type fยืนสำหรับไฟล์และwc -lคำสายนับ
Serge Stroobandt

3
ลบ-type fไดเรกทอรีที่จะรวมในการนับ
phatblat

3
ไม่จำเป็นสำหรับ-printธง
Zoltán

3
หากมีความเป็นไปได้ที่ชื่อไฟล์มีอักขระขึ้นบรรทัดใหม่คุณอาจต้องการใช้-print0แฟล็ก
gaboroncancio

2
@ gaboroncancio นั่นจะไม่ช่วยเว้นแต่ว่าการดำเนินการบางอย่างwcมีตัวเลือกในการอ่านรายการยกเลิก ดูคำตอบของฉันสำหรับทางเลือก
Reinstate Monica ได้โปรด

100

สำหรับไดเรกทอรีปัจจุบัน:

find -type f | wc -l

5
วิธีนี้ไม่นำชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่มาพิจารณา
Kusalananda

2
สำหรับไดเรกทอรีปัจจุบันคุณไม่จำเป็นต้องใช้แม้แต่.
baptx

1
ที่จริงบนแพลตฟอร์มบางอย่างที่คุณไม่ต้องการที่จะสะกดออกfind .
tripleee

1
@Kusalanandra ความคิดเห็นของคุณมีผลกับทุกคำตอบที่นี่
tripleee

69

หากคุณต้องการรายละเอียดจำนวนไฟล์ในแต่ละ dir ภายใต้ dir ปัจจุบันของคุณ:

for i in */ .*/ ; do 
    echo -n $i": " ; 
    (find "$i" -type f | wc -l) ; 
done

ที่สามารถไปทั้งหมดในบรรทัดเดียวแน่นอน วงเล็บจะชี้แจงwc -lว่าควรจะดูเอาต์พุตใด ( find $i -type fในกรณีนี้)


7
มันอาจติดอยู่ในไดเรกทอรีที่มีช่องว่างในชื่อของพวกเขา การเปลี่ยนบรรทัดแรกเพื่อfind . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; doแก้ไข ดูฉันจะอ่านไฟล์ (data stream, variable) ทีละบรรทัด (และ / หรือ field-by-field) ได้อย่างไร?
Arch Stanton

4
การใช้findลูปนอกเป็นเพียงภาวะแทรกซ้อนที่ไม่จำเป็น for i in */; do`
tripleee

ฟังก์ชัน countit {สำหรับ i ใน $ (find. -maxdepth 1 -type d); ทำ file_count = $ (หา $ i -type f | wc -l); echo "$ file_count: $ i"; เสร็จสิ้น}; countit | sort -n -r
Schneems

ในที่สุดนี่คือสิ่งที่ฉันต้องการ โฟลเดอร์ของฉันมีไฟล์หลายพันไฟล์ดังนั้นการพิมพ์ด้วยต้นไม้หรืออย่างอื่นนั้นไม่ใช่ตัวเลือก
lesolorzanov

ซึ่งรวมถึง .. / และดูเหมือนจะไม่ก้าวไปข้างหน้านั่นหมายถึงมันไม่ย่อท้อ
Daniel Lefebvre

50

คุณสามารถใช้ได้

$ tree

หลังจากติดตั้งแพ็คเกจต้นไม้ด้วย

$ sudo apt-get install tree

(บนเครื่อง Linux Debian / Mint / Ubuntu)

คำสั่งไม่เพียงแสดงจำนวนไฟล์เท่านั้น แต่ยังรวมถึงจำนวนไดเรกทอรีด้วย ตัวเลือก - L สามารถใช้เพื่อระบุระดับการแสดงผลสูงสุด (ซึ่งโดยค่าเริ่มต้นคือความลึกสูงสุดของโครงสร้างไดเรกทอรี)

ไฟล์ที่ซ่อนสามารถรวมได้ด้วยการจัดหา-aตัวเลือก


4
นี่เป็นวิธีที่ง่ายที่สุดในการดูจำนวนไดเรกทอรีและไฟล์
Lorem Ipsum Dolor

11
จากหน้าคน: โดยต้นไม้เริ่มต้นไม่ได้พิมพ์ไฟล์ที่ซ่อนอยู่ คุณต้องระบุ-aตัวเลือกเพื่อรวมไว้
eee

3
การติดตั้งนี้บน MacOS ใช้brewและเรียกกว่าที่หลังจากทำงานbrew install tree brew update
Ashish Ahuja

4
นอกจากนี้ยังพิมพ์ชื่อไฟล์ทั้งหมดดังนั้นมันจะช้าถ้าคุณมีไฟล์จำนวนมาก
Franck Dernoncourt

2
ว้าวเครื่องมือที่ดีมากมันสามารถพิมพ์โฟลเดอร์ colorized, รายการโฟลเดอร์เท่านั้นส่งออกเป็น JSON สามารถแสดงรายการโฟลเดอร์ 34k และไฟล์ 51k ในไม่กี่วินาที Olé!
brasofilo

46

บนคอมพิวเตอร์ของฉันrsyncเร็วกว่าfind | wc -lคำตอบที่ยอมรับเล็กน้อย:

$ rsync --stats --dry-run -ax /path/to/dir /tmp

Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes

บรรทัดที่สองมีจำนวนไฟล์ 150,481 ในตัวอย่างข้างต้น เป็นโบนัสคุณจะได้รับขนาดรวมเช่นกัน (เป็นไบต์)

หมายเหตุ:

  • บรรทัดแรกคือจำนวนไฟล์ไดเรกทอรี symlinks ฯลฯ ทั้งหมดเข้าด้วยกันนั่นเป็นสาเหตุที่มันใหญ่กว่าบรรทัดที่สอง
  • ตัวเลือก--dry-run(หรือ-nสั้น ๆ ) เป็นสิ่งสำคัญที่จะไม่ถ่ายโอนไฟล์จริง!
  • ฉันใช้-xตัวเลือกเพื่อ "ไม่ข้ามขอบเขตระบบไฟล์" ซึ่งหมายความว่าถ้าคุณดำเนินการ/และคุณมีฮาร์ดดิสก์ภายนอกติดอยู่มันจะนับเฉพาะไฟล์ในพาร์ติชันราก

ฉันชอบความคิดของคุณในการใช้ rsync ที่นี่ ฉันไม่เคยคิดถึงเรื่องนี้เลย!
Qeole

ขอบคุณ @Qeole ความคิดไม่ได้เป็นของฉัน ฉันอ่านมันเมื่อหลายปีก่อนที่ไหนสักแห่งที่ rsync นั้นเร็วที่สุดในการลบโฟลเดอร์ที่มีไฟล์และโฟลเดอร์ย่อยจำนวนมากดังนั้นฉันคิดว่ามันอาจจะนับจำนวนไฟล์ได้อย่างรวดเร็วเช่นกัน
psmith

1
พยายามนี้ หลังจากรันทั้งสองครั้งล่วงหน้าเพื่อเติมแคช fs find ~ -type f | wc -lใช้เวลา 1.7 / 0.5 / 1.33 วินาที (จริง / ผู้ใช้ / sys) rsync --stats --dry-run -ax ~ /xxxใช้เวลา 4.4 / 3.1 / 2.1 วินาที มีไว้สำหรับประมาณ 500,000 ไฟล์บน SSD
ผอม

Dunno สิ่งที่รุ่นของ rsync ที่คุณใช้ แต่ใน 3.1.2 มันเล็ก ๆ น้อย ๆ ให้อ่านง่ายขึ้น:Number of files: 487 (reg: 295, dir: 192)
mpen

ฉันใช้ rsync เริ่มต้นบน macOS:rsync version 2.6.9 protocol version 29
psmith

20

เนื่องจากชื่อไฟล์ใน UNIX อาจมีการขึ้นบรรทัดใหม่ (ใช่, การขึ้นบรรทัดใหม่) wc -lอาจนับจำนวนไฟล์มากเกินไป ฉันจะพิมพ์จุดสำหรับทุกไฟล์แล้วนับจำนวนจุด:

find DIR_NAME -type f -printf "." | wc -c

1
ดูเหมือนว่านี่เป็นทางออกเดียวที่จัดการไฟล์ที่มีบรรทัดใหม่ในชื่อของพวกเขา upvoted
codeforester

2
ฮิฮิ :) ฉันรักบรรทัดใหม่ในชื่อไฟล์ ทำให้พวกเขาอ่านง่ายขึ้น
hek2mgl

ฉันหมายถึงบรรทัดใหม่ในชื่อไฟล์ไม่ใช่เนื้อหา!
codeforester

1
ฉันแค่ล้อเล่น ... ใช่บรรทัดใหม่ในชื่อไฟล์จะต้องนำมาพิจารณาเสมอ พวกเขาอาจมาจากเนื้อหาที่เป็นอันตรายหรือน่าตื่นเต้นน้อยกว่าจากการพิมพ์ผิด
hek2mgl

18

เมื่อรวมคำตอบหลายข้อเข้าด้วยกันแล้วทางออกที่มีประโยชน์ที่สุดน่าจะเป็น:

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n

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

คุณสามารถเพิ่มจำนวนหลังจาก-maxdepthได้รับการนับไดเรกทอรีย่อยด้วย โปรดทราบว่าการดำเนินการนี้อาจใช้เวลานานโดยเฉพาะอย่างยิ่งหากคุณมีโครงสร้างไดเรกทอรีที่ซ้อนกันสูงร่วมกับ-maxdepthจำนวนที่ สูง


กับecho -eอะไร ฉันเดาว่าคุณใส่มันเพื่อพับบรรทัดใหม่ใด ๆ แต่มันจะรวมช่องว่างที่ผิดปกติอื่น ๆ และพยายามที่จะขยายอักขระตัวแทนใด ๆ ที่แสดงคำต่อคำในชื่อไฟล์ ฉันจะไปกับสิ่งที่ชอบfind .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'และอยู่กับความผิดปกติใด ๆ ในผลลัพธ์หรืออาจเล่นกับ Bash printf "%q"เพื่อพิมพ์ชื่อไดเรกทอรี
tripleee

10

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

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

สิ่งนี้จะทำงานในรสชาติของ GNU และเพียงละเว้น -e จากคำสั่ง echo สำหรับ BSD linux (เช่น OSX)


2
ทางออกที่ดีเยี่ยม! ปัญหาเดียวที่ฉันพบคือไดเรกทอรีที่มีช่องว่างหรืออักขระพิเศษ เพิ่มคำพูดที่ใช้ชื่อ dir:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
John Kary

1
ฉันได้ปรับเปลี่ยนเล็กน้อยและใช้งานได้ดีสำหรับฉัน:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
Wizek

ความคิดเห็นของฉันเกี่ยวกับคำตอบของ @ Sebastian ก็มีผลเช่นกัน การใช้echo -e(หรือเพียง `echo` ในความคิดเห็นก่อนหน้านี้) ในชื่อไดเรกทอรีที่ไม่มีการอ้างอิงเป็นการค้าปัญหาหนึ่งสำหรับอีกปัญหาหนึ่ง
tripleee

8

หากคุณต้องการหลีกเลี่ยงกรณีที่มีข้อผิดพลาดไม่อนุญาตให้wc -lดูไฟล์ที่มีบรรทัดใหม่ (ซึ่งจะนับเป็น 2 ไฟล์)

เช่นพิจารณากรณีที่เรามีไฟล์เดียวที่มีอักขระ EOL เดียวในนั้น

> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

เนื่องจากอย่างน้อย gnu wcไม่ปรากฏว่ามีตัวเลือกในการอ่าน / นับรายการที่สิ้นสุดด้วยค่า null (ยกเว้นจากไฟล์) ทางออกที่ง่ายที่สุดคือการไม่ผ่านชื่อไฟล์ แต่มีเอาต์พุตแบบคงที่ทุกครั้งที่พบไฟล์เช่น ในไดเรกทอรีเดียวกันกับด้านบน

> find -type f -exec printf '\n' \; | wc -l
1

หรือถ้าคุณfindรองรับมัน

> find -type f -printf '\n' | wc -l
1 

7

ncduคุณสามารถใช้คำสั่ง มันจะนับซ้ำจำนวนไฟล์ในไดเรกทอรี Linux นี่คือตัวอย่างของเอาต์พุต:

ป้อนคำอธิบายรูปภาพที่นี่

มันมีแถบความคืบหน้าซึ่งจะสะดวกถ้าคุณมีไฟล์จำนวนมาก:

ป้อนคำอธิบายรูปภาพที่นี่

วิธีติดตั้งบน Ubuntu:

sudo apt-get install -y ncdu

เกณฑ์มาตรฐาน: ฉันใช้https://archive.org/details/cv_corpus_v1.tar (ไฟล์ 380390, 11 GB) เป็นโฟลเดอร์ที่ต้องนับจำนวนไฟล์

  • find . -type f | wc -l: ประมาณ 1m20s เพื่อให้เสร็จสมบูรณ์
  • ncdu: ประมาณ 1m20s เพื่อให้เสร็จสมบูรณ์

ที่คำนวณการใช้งานดิสก์เป็นหลักไม่ใช่จำนวนไฟล์ ค่าใช้จ่ายเพิ่มเติมนี้อาจไม่ต้องการ (นอกเหนือจากความจำเป็นในการติดตั้งแพคเกจเพิ่มเติมสำหรับสิ่งที่สามารถทำได้ด้วยยูทิลิตี้ POSIX มาตรฐาน)
hek2mgl

@ hek2mglมันคำนวณจำนวนไฟล์ตามที่แสดงเป็นสีแดงในสกรีนช็อตแรก ฉันใช้เวลาสองสามนาทีเพื่อรับไฟล์ประมาณ 2 ล้านไฟล์ดังนั้นความเร็วจึงไม่เลวร้ายนัก
Franck Dernoncourt

2
@ hek2mgl ฉันเพิ่มมาตรฐานทำซ้ำในคำตอบที่ฉันวิ่งมันสองครั้งและฉันไม่ได้เห็นความแตกต่างระหว่างและfind . -type f | wc -l ncdu
Franck Dernoncourt

2
ใช่ดูเหมือนfindอยู่ภายใต้ฝากระโปรงหน้าการดำเนินการมากขึ้นหรือน้อยเหมือนกันสายระบบเป็นซึ่งเป็นแบ็กเอนด์สำหรับdu ncduเพียงแค่มัดพวกเขา
hek2mgl

1
@FranckDernoncourt รักมัน ฉันมีไฟล์มากมายในโฟลเดอร์และการมีแถบความคืบหน้าเป็นตัวช่วยชีวิต ขอบคุณสำหรับการแบ่งปัน!
Geek


4

ls -1 | wc -lเพื่อตรวจสอบจำนวนไฟล์ที่มีอยู่ในไดเรกทอรีปัจจุบันใส่ใน นี้จะใช้wcในการทำการนับจำนวนของเส้นที่ในการส่งออกของ(-l) ls -1มันไม่นับ dotfiles โปรดทราบว่าls -l(นั่นคือ "L" แทนที่จะเป็น "1" เหมือนในตัวอย่างก่อนหน้านี้) ซึ่งฉันใช้ใน HOWTO รุ่นก่อนหน้านี้จะให้ไฟล์กับคุณมากกว่าหนึ่งจำนวนจริง ขอบคุณ Kam Nejad สำหรับประเด็นนี้

หากคุณต้องการนับเฉพาะไฟล์และไม่รวมลิงก์สัญลักษณ์ (เป็นเพียงตัวอย่างของสิ่งที่คุณสามารถทำได้) คุณสามารถใช้ls -l | grep -v ^l | wc -l(นั่นคือ "L" ไม่ใช่ "1" ในเวลานี้เราต้องการรายชื่อ "ยาว" ที่นี่) . grepตรวจสอบบรรทัดที่ขึ้นต้นด้วย "l" (ระบุลิงค์) และทิ้งบรรทัดนั้น (-v)

ความเร็วสัมพัทธ์: "ls -1 / usr / bin / | wc -l" ใช้เวลาประมาณ 1.03 วินาทีในการโหลด 486SX25 (/ usr / bin / บนเครื่องนี้มีไฟล์ 355) " ls -l /usr/bin/ | grep -v ^l | wc -l" ใช้เวลาประมาณ 1.19 วินาที

ที่มา: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html


2
ls -lต้องทำstatsyscall ในทุกไฟล์เพื่ออ่านขนาดคุณสมบัติ mtime และคุณสมบัติอื่น ๆ ซึ่งช้า ในไดเรกทอรีใหญ่ (100.000+ ไฟล์) ทำงานls -lอาจใช้เวลาหลายนาที ls -1 | wc -lดังนั้นเพื่อให้นับเฉพาะไฟล์เสมอการใช้งาน
Marki555

A 486SX25, ดี
cam8001

ls -1ยังคงช้าในไดเรกทอรีขนาดใหญ่เนื่องจากต้องเรียงลำดับไฟล์ เพียงแค่printf '%s\n' *จะเป็นสิ่งเดียวกันและหลีกเลี่ยงภายนอกlsโทร (ซึ่งเป็นปัญหาแต่อย่างใด) แต่ soluton มีประสิทธิภาพมากที่สุดคือการใช้คำสั่งที่ไม่ได้ดำเนินการเรียงลำดับใด ๆ findเช่น (เอาต์พุต glob ถูกจัดเรียงตามเปลือก)
tripleee

4

หากสิ่งที่คุณต้องการคือการนับประเภทไฟล์ที่ เรียกซ้ำคุณสามารถทำได้:

find YOUR_PATH -name '*.html' -type f | wc -l 

-l เป็นเพียงการแสดงจำนวนบรรทัดในผลลัพธ์


นามสกุลเป็นส่วนหนึ่งของชื่อไฟล์และอาจไม่แสดงถึงไฟล์ TYPE
Waxhead

4

ด้วยทุบตี:

สร้างอาร์เรย์ของรายการด้วย () และรับจำนวนด้วย #

FILES=(./*); echo ${#FILES[@]}

ตกลงที่ไม่นับไฟล์ซ้ำ แต่ฉันต้องการที่จะแสดงตัวเลือกที่ง่ายก่อน กรณีการใช้งานทั่วไปอาจใช้เพื่อสร้างการสำรองข้อมูลแบบโรลโอเวอร์ของไฟล์ สิ่งนี้จะสร้าง logfile.1, logfile.2, logfile.3 เป็นต้น

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

จำนวนการเรียกซ้ำที่globstarเปิดใช้งานbash 4+ (ตามที่กล่าวถึงโดย @tripleee)

FILES=(**/*); echo ${#FILES[@]}

ในการรับจำนวนไฟล์ซ้ำเรายังคงสามารถใช้ find ในวิธีเดียวกันได้

FILES=(`find . -type f`); echo ${#FILES[@]}

กระสุนสมัยใหม่รองรับ**/*การแจงนับซ้ำ ยังคงมีประสิทธิภาพน้อยกว่าfindในไดเรกทอรีขนาดใหญ่เนื่องจากเชลล์ต้องเรียงลำดับไฟล์ในแต่ละไดเรกทอรี
tripleee

2

สำหรับไดเรกทอรีที่มีช่องว่างในชื่อ ... (ขึ้นอยู่กับคำตอบที่หลากหลายด้านบน) - พิมพ์ชื่อไดเรกทอรีซ้ำด้วยจำนวนไฟล์ภายใน:

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done

ตัวอย่าง (จัดรูปแบบเพื่อให้สามารถอ่านได้):

pwd
  /mnt/Vancouver/Programming/scripts/claws/corpus

ls -l
  total 8
  drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
  drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'

ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
  138

## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
  29

โครงสร้างไดเรกทอรีแสดงภาพได้ดีขึ้นโดยใช้tree:

tree -L 3 -F .
  .
  ├── Catabolism - Autophagy; Phagosomes; Mitophagy/
  │   ├── 1
  │   ├── 10
  │   ├── [ ... SNIP! (138 files, total) ... ]
  │   ├── 98
  │   └── 99
  └── Catabolism - Lysosomes/
      ├── 1
      ├── 10
      ├── [ ... SNIP! (28 files, total) ... ]
      ├── 8
      ├── 9
      └── aaa/
          └── bbb

  3 directories, 167 files

man find | grep mindep
  -mindepth levels
    Do not apply any tests or actions at levels less than levels
    (a non-negative integer).  -mindepth 1 means process all files
    except the starting-points.

ls -p | grep -v /(ใช้ด้านล่าง) มาจากคำตอบ 2 ที่/unix/48492/list-only-regular-files-but-not-directories-in-current-directory

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1

Applcation: ฉันต้องการค้นหาจำนวนไฟล์สูงสุดในไดเรกทอรีหลายร้อยไดเรกทอรี (ทุกความลึก = 1) [เอาท์พุทด้านล่างในรูปแบบอีกครั้งเพื่อให้อ่านง่าย]:

date; pwd
    Fri Mar 29 20:08:08 PDT 2019
    /home/victoria/Mail/2_RESEARCH - NEWS

time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
    0:00.03

[victoria@victoria 2_RESEARCH - NEWS]$ head -n5 ../../aaa
    ./RNA - Exosomes: 26
    ./Cellular Signaling - Receptors: 213
    ./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
    ./Stress - Physiological, Cellular - General: 261
    ./Ancient DNA; Ancient Protein: 34

[victoria@victoria 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/\2: \1/g' ../../aaa | sort -V | (head; echo ''; tail)

    0: ./Genomics - Gene Drive
    1: ./Causality; Causal Relationships
    1: ./Cloning
    1: ./GenMAPP 2
    1: ./Pathway Interaction Database
    1: ./Wasps
    2: ./Cellular Signaling - Ras-MAPK Pathway
    2: ./Cell Death - Ferroptosis
    2: ./Diet - Apples
    2: ./Environment - Waste Management

    988: ./Genomics - PPM (Personalized & Precision Medicine)
    1113: ./Microbes - Pathogens, Parasites
    1418: ./Health - Female
    1420: ./Immunity, Inflammation - General
    1522: ./Science, Research - Miscellaneous
    1797: ./Genomics
    1910: ./Neuroscience, Neurobiology
    2740: ./Genomics - Functional
    3943: ./Cancer
    4375: ./Health - Disease 

sort -Vเป็นธรรมชาติ ... ดังนั้นจำนวนไฟล์สูงสุดในไดเรกทอรีใด ๆ (Claws Mail) คือ 4375 ไฟล์ ถ้าฉันกดปุ่มซ้าย ( https://stackoverflow.com/a/55409116/1904943 ) ชื่อไฟล์เหล่านั้น - ชื่อทั้งหมดเป็นตัวเลขเริ่มต้นด้วย 1 ในแต่ละไดเรกทอรี - และรองถึง 5 หลักทั้งหมดฉันควรจะตกลง .


ภาคผนวก

ค้นหาจำนวนไฟล์ทั้งหมดไดเรกทอรีย่อยในไดเรกทอรี

$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS

$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News

Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine

$ find . -type f | wc -l
70214    ## files

$ find . -type d | wc -l
417      ## subdirectories

1

ฉันได้เขียนffcntเพื่อเพิ่มความเร็วในการนับไฟล์แบบเรียกซ้ำภายใต้สถานการณ์เฉพาะ: ดิสก์แบบหมุนและระบบไฟล์ที่รองรับการทำแผนที่ขอบเขต

มันสามารถเป็นลำดับความสำคัญได้เร็วกว่าlsหรือfindตามแนวทาง แต่ YMMV


0

มีคำตอบที่ถูกต้องมากมายที่นี่ นี่คืออีก!

find . -type f | sort | uniq -w 10 -c

โดยที่.โฟลเดอร์จะค้นหาและ10คือจำนวนอักขระที่จะจัดกลุ่มไดเรกทอรี


-1

ค้นหาประเภท f | ห้องสุขา -l

หรือ (ถ้าไดเรกทอรีเป็นไดเรกทอรีปัจจุบัน)

หา -type f | ห้องสุขา -l


คำตอบนี้ซ้ำกันอย่างน้อยหนึ่งคำตอบสำหรับคำถามเดียวกันนี้
Kusalananda

-1

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

ls | wc -l

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

-1

แนวทางอื่นที่มีการกรองสำหรับรูปแบบจะนับโมดูลเคอร์เนล grub ที่มีอยู่ทั้งหมด:

ls -l /boot/grub/*.mod | wc -l

-3
ls -l | grep -e -x -e -dr | wc -l 
  1. รายการยาว
  2. กรองไฟล์และ dirs
  3. นับจำนวนบรรทัดที่กรอง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.