นับไฟล์ทั้งหมดซ้ำในไดเรกทอรีซ้ำ [ซ้ำ]


198

ซ้ำเป็นไปได้:
ฉันจะนับจำนวนโฟลเดอร์ในไดรฟ์ที่ใช้ Linux ได้อย่างไร

ฉันมีต้นไม้ไดเรกทอรีลึกมากในกล่อง Linux ของฉัน ฉันต้องการนับไฟล์ทั้งหมดในเส้นทางนั้นรวมถึงไดเรกทอรีย่อยทั้งหมด

ตัวอย่างเช่นให้ต้นไม้ไดเรกทอรีนี้:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

หากฉันผ่าน/homeฉันต้องการให้ส่งคืนสี่ไฟล์ หรือคะแนนโบนัสถ้ามันส่งคืนสี่ไฟล์และสองไดเรกทอรี โดยทั่วไปฉันต้องการเทียบเท่าการคลิกขวาที่โฟลเดอร์ใน Windows และเลือกคุณสมบัติและดูว่ามีไฟล์ / โฟลเดอร์อยู่ในโฟลเดอร์นั้นกี่ไฟล์

ฉันจะทำสิ่งนี้ได้ง่ายที่สุดได้อย่างไร? ฉันมีวิธีแก้ปัญหาเกี่ยวกับสคริปต์ Python ที่ฉันเขียน แต่ทำไมมันไม่ง่ายเหมือนการทำงานls | wcหรือคล้ายกัน


ไม่ว่าสิ่งที่คุณกำลังมองหา แต่ที่จะได้รับรางวัลรวมอย่างรวดเร็วมากถ้าคุณlocateฐานข้อมูลถึงวันที่: locate /some/path | wc -l(หรือบน Mac ของฉัน: locate -c /some/path) แต่: สิ่งนี้จะนับไฟล์/this/other/path/with/some/pathด้วยและจะนับโฟลเดอร์ด้วยตนเอง
Arjan

โดยวิธีการนี้เป็นปัญหาที่แตกต่างกัน แต่มีความเกี่ยวข้องอย่างใกล้ชิด (นับไดเรกทอรีทั้งหมดในไดรฟ์) และวิธีแก้ปัญหา: superuser.com/questions/129088/…
Amanda

คำตอบ:


340

find . -type f | wc -l

คำอธิบาย:
find . -type fค้นหาไฟล์ทั้งหมด ( -type f ) ในไดเร็กทอรี( . ) นี้และในทุกไดเร็กทอรีย่อยชื่อไฟล์จะถูกพิมพ์ออกมาเป็นมาตรฐานหนึ่งไฟล์ต่อบรรทัด

นี้เป็นประปาแล้ว| เข้าสู่wc(การนับจำนวนคำ) -lตัวเลือกจะบอก wc ให้นับจำนวนบรรทัดของอินพุตเท่านั้น

พวกเขาช่วยกันนับรวมไฟล์ทั้งหมดของคุณ


1
สิ่งนี้ไม่ได้จัดการกับข้อผิดพลาดแบบออฟไลน์เนื่องจากบรรทัดใหม่ล่าสุดจากfindผลลัพธ์
RobertDeRose

สำหรับการนับไดเรกทอรีเท่านั้นให้ใช้ '-type d' แทน '-type f': D
MevlütÖzdemir

1
เมื่อไม่พบไฟล์ผลลัพธ์คือ1
Dylanthepiguy

47

คำตอบข้างต้นตอบคำถามแล้ว แต่ฉันจะเพิ่มว่าถ้าคุณใช้ค้นหาโดยไม่มีข้อโต้แย้ง (ยกเว้นโฟลเดอร์ที่คุณต้องการให้การค้นหาเกิดขึ้น) เช่นเดียวกับใน:

find . | wc -l

การค้นหานั้นเร็วกว่ามากเกือบจะทันทีหรืออย่างน้อยก็ทำให้ฉัน นี่เป็นเพราะส่วนคำสั่งประเภทนั้นจะต้องเรียกใช้ระบบ stat () ในแต่ละชื่อเพื่อตรวจสอบประเภทของมันโดยที่ไม่ต้องทำเช่นนั้น

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


1
เมื่อไม่พบไฟล์ผลลัพธ์คือ1
Dylanthepiguy

25

สำหรับไฟล์:

find -type f | wc -l

สำหรับไดเรกทอรี:

find -mindepth 1 -type d | wc -l

พวกเขาทั้งสองทำงานในไดเรกทอรีการทำงานปัจจุบัน


1
เมื่อไม่พบไฟล์ผลลัพธ์คือ1
Dylanthepiguy

8

ด้วยทุบตี 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

ไม่จำเป็นต้องโทรหาสองครั้งหากคุณต้องการค้นหาไฟล์และไดเรกทอรี


8

อัปเดตเป็นคำตอบที่ได้รับการยอมรับเล็กน้อยหากคุณต้องการนับ dirs และเช่นนั้น

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn

1
บนเครื่อง Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(นี่ประเภท%Tเป็นที่ว่างเปล่าสำหรับไฟล์ปกติดอกจันสำหรับแฟ้มที่ปฏิบัติการหรือเฉือนสำหรับโฟลเดอร์จึงเป็นสิ่งจำเป็นหรือบางข้อความเพิ่มเติมเพื่อหลีกเลี่ยงจากพื้นที่ไม่ได้ถูกนับเช่น%HT > %T)
Arjan

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