ฉันมีไดเรกทอรีที่มีไฟล์จำนวนมาก ฉันไม่เห็นls
สวิตช์ให้การนับ มีเวทมนตร์บรรทัดคำสั่งเพื่อรับจำนวนไฟล์หรือไม่
tree . | tail
หรือหากtree -a . | tail
ต้องการรวมไฟล์ / dirs ที่ซ่อนไว้tree
จะเรียกซ้ำหากเป็นสิ่งที่คุณต้องการ
ฉันมีไดเรกทอรีที่มีไฟล์จำนวนมาก ฉันไม่เห็นls
สวิตช์ให้การนับ มีเวทมนตร์บรรทัดคำสั่งเพื่อรับจำนวนไฟล์หรือไม่
tree . | tail
หรือหากtree -a . | tail
ต้องการรวมไฟล์ / dirs ที่ซ่อนไว้tree
จะเรียกซ้ำหากเป็นสิ่งที่คุณต้องการ
คำตอบ:
การใช้คำจำกัดความกว้าง ๆ ของ "ไฟล์"
ls | wc -l
(โปรดทราบว่าจะไม่นับไฟล์ที่ซ่อนอยู่และถือว่าชื่อไฟล์ไม่มีอักขระขึ้นบรรทัดใหม่)
ในการรวมไฟล์ที่ซ่อนอยู่ (ยกเว้น.
และ..
) และหลีกเลี่ยงปัญหาเกี่ยวกับอักขระบรรทัดใหม่ทางบัญญัติคือ:
find . ! -name . -prune -print | grep -c /
หรือเรียกซ้ำ:
find .//. ! -name . -print | grep -c //
wc
เป็นโปรแกรม "นับจำนวนคำ" -l
สวิทช์ทำให้เกิดการนับจำนวนบรรทัด ls
ในกรณีนี้ก็นับเส้นในการส่งออกจาก นี่คือวิธีที่ฉันได้รับการสอนเสมอเพื่อให้ได้จำนวนไฟล์สำหรับไดเรกทอรีที่กำหนดเช่นกัน
ls
จะเกิดขึ้นls -1
หากเอาต์พุตเป็นไพพ์
ls -la
คุณจะได้รับสามบรรทัดในไดเรกทอรี คุณต้องการls -lA | wc -l
ข้ามรายการ.
และ ..
อย่างไรก็ตามคุณจะยังคงเป็นแบบหนึ่งต่อหนึ่ง
ls -q | wc -l
- แม้ว่าโปรดทราบว่าไฟล์ที่ซ่อนอยู่จะยังไม่ถูกนับด้วยวิธีการนี้และไดเรกทอรีนั้นจะถูกนับ
สำหรับคำจำกัดความที่แคบของไฟล์:
find . -maxdepth 1 -type f | wc -l
-maxdepth 1
นับไฟล์แบบเรียกซ้ำ (หรือปรับตามความลึกของการค้นหาสูงสุดที่ต้องการ)
find -maxdepth 1 -type f -printf "\n" | wc -l
ls -1 | wc -l
...
$ ls --help | grep -- ' -1'
-1 list one file per line
...
$ wc --help | grep -- ' -l'
-l, --lines print the newline counts
PS: หมายเหตุ ls - <number-one> | wc - <letter-l>
ls
ทำ-1
โดยอัตโนมัติเมื่อเอาต์พุตไปยังไพพ์
[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
อาจเป็นคำตอบที่สมบูรณ์ที่สุดโดยใช้ls
/ wc
คู่คือ
ls -Aq | wc -l
หากคุณต้องการนับไฟล์ดอทและ
ls -q | wc -l
มิฉะนั้น.
-A
คือการนับไฟล์จุด แต่ละเว้นและ.
..
-q
ทำให้ls
แทนที่อักขระ nongraphic อักขระขึ้นบรรทัดใหม่โดยเฉพาะด้วย?
การสร้างเอาต์พุต 1 บรรทัดสำหรับแต่ละไฟล์ในการรับเอาท์พุทหนึ่งบรรทัดจากls
ในเทอร์มินัล (เช่นโดยไม่ต้องปิปเข้าไปwc
) -1
จะต้องเพิ่มตัวเลือก
(พฤติกรรมของls
การทดสอบกับ coreutils 8.23)
-1
ไม่จำเป็น สำหรับ"มันจัดการบรรทัดใหม่ในชื่อไฟล์อย่างสมเหตุสมผลด้วยเอาต์พุตคอนโซล"นี่เป็นเพราะ-q
สวิตช์ (ซึ่งคุณควรใช้แทน-b
เพราะมันพกพาได้) ซึ่ง"บังคับแต่ละอินสแตนซ์ของอักขระชื่อไฟล์ที่ไม่สามารถพิมพ์ได้และตัวอักษร <tab> เป็นอักขระ <question-mark> ('?') การใช้งานอาจมีตัวเลือกนี้เป็นค่าเริ่มต้นหากเอาต์พุตเป็นอุปกรณ์ปลายทาง " ดังนั้นเช่นls -Aq | wc -l
การนับไฟล์ / dirs ทั้งหมดหรือls -qp | grep -c /
นับเฉพาะ dirs ที่ไม่ได้ซ่อนเป็นต้น
-b
-q
หากคุณรู้ว่าไดเรกทอรีปัจจุบันมีไฟล์ที่ไม่ซ่อนไว้อย่างน้อยหนึ่งไฟล์:
set -- *; echo "$#"
เห็นได้ชัดว่านี่คือ generalizing ใด ๆ glob
ในสคริปต์สิ่งนี้มีผลข้างเคียงที่โชคร้ายในบางครั้งของการเขียนทับพารามิเตอร์ตำแหน่ง คุณสามารถแก้ไขได้โดยใช้ subshell หรือฟังก์ชั่น (เวอร์ชัน Bourne / POSIX) เช่น:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
$(ls -d -- * | wc -l)
วิธีการแก้ปัญหาทางเลือกคือ หาก glob เป็นคำสั่งที่สามารถลงไป*
$(ls | wc -l)
การแยกวิเคราะห์ผลลัพธ์ของการls
ทำให้ฉันไม่สบายใจเสมอ แต่ที่นี่ควรจะทำงานตราบใดที่ชื่อไฟล์ของคุณไม่มีการขึ้นบรรทัดใหม่หรือls
หนีออกมาได้ และ$(ls -d -- * 2>/dev/null | wc -l)
มีข้อได้เปรียบในการจัดการกับกรณีของก้อนกลมที่ไม่ได้จับคู่อย่างสง่างาม (กล่าวคือมันคืนค่า 0 ในกรณีนั้นในขณะที่set *
วิธีการนั้นต้องการการทดสอบที่ยุ่งเหยิงหากก้อนกลมอาจว่างเปล่า)
$(ls -d ./* | grep -c /)
ถ้าชื่อไฟล์อาจจะมีตัวอักษรขึ้นบรรทัดใหม่อีกทางเลือกหนึ่งคือการใช้
โซลูชันใด ๆ เหล่านั้นที่พึ่งพาการส่งผ่านการขยายของ glob ไปls
อาจล้มเหลวพร้อมกับรายการอาร์กิวเมนต์ที่ผิดพลาดนานเกินไปหากมีไฟล์ที่ตรงกันจำนวนมาก
local
หรือขจัดความมันeval $1=$#
หรือเพียงแค่ใช้และทำecho $#
number_of_files=$(count_words *)
$#
(คุณไม่ได้ทำอย่างนั้นมาก่อนการแก้ไข)
$1
และผ่านชื่อตัวแปรเป็น สิ่งที่ฉันต้องการนับคือจำนวนพารามิเตอร์ที่ไม่ใช่พารามิเตอร์แรก (ฉันไม่สามารถใช้shift
เพราะฉันต้องการให้ชื่อตัวแปรอยู่รอบ ๆ ) (อืมตอนนี้ถ้าคุณถามเกี่ยวกับบรรทัดแรก ... )
shift
ถ้าฉันถูกเวลา
ฉันพบว่าdu --inodes
มีประโยชน์ แต่ฉันไม่แน่ใจว่าdu
ต้องใช้เวอร์ชันใด มันควรจะเป็นอย่างมากเร็วกว่าวิธีการทางเลือกใช้และfind
wc
บน Ubuntu 17.10 ทำงานได้ดังต่อไปนี้:
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
รวมกับ| sort -nr
การเรียงลำดับจากมากไปน้อยตามจำนวนของ inodes ที่มี
ในขณะที่ใช้คู่ ls / wc หากเราเพิ่ม -U มันจะเร็วขึ้นมาก (อย่าเรียงลำดับ)
ls -AqU | wc -l
-U
เป็นเฉพาะ GNU แม้ว่า
หลังจากติดตั้งคำสั่ง tree ให้พิมพ์:
tree
หากคุณต้องการไฟล์ที่ซ่อนอยู่ด้วย:
tree -a
หากคุณใช้ Debian / Mint / Ubuntu Linux ให้พิมพ์คำสั่งต่อไปนี้เพื่อติดตั้งคำสั่ง tree:
sudo apt-get install tree
อ็อพชัน -L ใช้สำหรับการระบุระดับการแสดงผลสูงสุดของแผนผังไดเร็กทอรี คำสั่ง tree ไม่เพียง แต่นับจำนวนไฟล์เท่านั้น แต่ยังรวมถึงจำนวนไดเรคทอรี่โดยพิจารณาถึงระดับไดเรคทอรีตามที่คุณต้องการ
find -maxdepth 1 -type f -printf . | wc -c
-maxdepth 1
จะทำให้ไม่เกิดซ้ำfind
เรียกซ้ำโดยค่าเริ่มต้น-type f
จะรวมไฟล์เท่านั้น-printf .
เป็นสัมผัสที่น่ารัก มันพิมพ์จุดสำหรับแต่ละไฟล์แทนชื่อไฟล์และตอนนี้สามารถจัดการกับชื่อไฟล์ใด ๆ และยังบันทึกข้อมูล เราแค่ต้องนับจุด :)| wc -c
นับจำนวนตัวอักษรไม่มีท่อไม่มีการคัดลอกสตริงไม่มีส้อมเพียงแค่ทุบตีหนึ่งซับ
$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
นี่เป็นอีกเทคนิคหนึ่งในแนวของGilles ที่โพสต์ :
word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
ซึ่งสร้างอาร์เรย์ที่มีองค์ประกอบ 13,923 (ถ้านั่นคือจำนวนไฟล์ที่มี)
c
อาเรย์นั้นคืออะไร? word_count() { echo "$#"; }
จะเพียงพอ จุดของการแก้ปัญหา @Gilles คือการเก็บจำนวนในตัวแปรกลับเพื่อหลีกเลี่ยงการใช้การทดแทนคำสั่ง (ซึ่งเกี่ยวข้องกับส้อมและท่อในเปลือกอื่น ๆ กว่า ksh93)
find . -type f -maxdepth 1 | wc -l
นี่สามารถแสดงรายการไฟล์ในไดเรกทอรีปัจจุบันเท่านั้น
find . -type f
จะค้นหาไฟล์ในไดเรกทอรีปัจจุบันและซ้ำในไดเรกทอรีย่อย
ลองนี้ฉันหวังว่าคำตอบนี้จะช่วยคุณ
echo $((`ls -l | wc -l` -1 ))
คุณสามารถตรวจสอบกับ:
ls -l | grep -v ^l | wc -l
ปรับปรุงคำตอบที่ให้ไว้ก่อนหน้า แต่คราวนี้ทำอย่างชัดเจน
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
มันคุ้มค่าที่จะสังเกตเห็นการใช้งานของบางคำสั่งเช่นรักและtail
cut
นอกจากนี้โปรดทราบว่าต้นไม้จะไม่สามารถใช้ได้ตามค่าเริ่มต้น คำสั่งด้านบนแรกจับข้อมูลเกี่ยวกับไดเรกทอรีที่ระดับ 1 จากนั้นรับบรรทัดสุดท้ายtail -n 1
ที่เป้าหมายของเราคือและจบลงด้วยcut
การใช้คำที่สาม
ตัวอย่างเช่นค้นหาใน/
:
/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
ถ้าเช่นนั้นถามเกี่ยวกับจำนวนไดเรกทอรี?
บน Linux เพื่อทำให้คำสั่งมีความสมบูรณ์และจัดการไฟล์ที่อาจมีการขึ้นบรรทัดใหม่ในชื่อให้ใช้:
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
นี้ช่วยเราจากความเจ็บปวดของการแยกls
เอาท์พุท
ที่เกี่ยวข้อง:
ใช้tree
คำสั่งเพียง:
tree