ฉันต้องการคำสั่ง BASH เพื่อแสดงรายการเฉพาะจำนวนไฟล์ในแต่ละไดเรกทอรีย่อยของไดเรกทอรี
เช่นในไดเรกทอรี/tmp
มีdir1
, dir2
... ผมอยากจะดู:
`dir1` : x files
`dir2` : x files ...
ฉันต้องการคำสั่ง BASH เพื่อแสดงรายการเฉพาะจำนวนไฟล์ในแต่ละไดเรกทอรีย่อยของไดเรกทอรี
เช่นในไดเรกทอรี/tmp
มีdir1
, dir2
... ผมอยากจะดู:
`dir1` : x files
`dir2` : x files ...
คำตอบ:
สมมติว่าคุณต้องการจำนวนไฟล์ที่เรียกซ้ำเท่านั้นไม่ใช่ไดเรกทอรีและประเภทอื่น ๆ สิ่งที่ควรทำ:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
printf "%-25.25s : " "$dir"
find "$dir" -type f | wc -l
done
find
... -print0 | xargs -0
....
bash
alias
!!
sort -rn -k 2,2 -t$':'
คุณจะได้รับรายชื่อ DESC
งานนี้ทำให้ฉันหลงใหลมากจนฉันอยากรู้วิธีแก้ปัญหาด้วยตัวเอง มันไม่ได้ใช้เวลาสักครู่และอาจเร็วกว่าในการประมวลผล ความพยายามของ Thor ช่วยให้ฉันมีความเข้าใจในรายละเอียดอย่างมาก
ดังนั้นนี่คือของฉัน:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
มันดูเรียบง่ายด้วยเหตุผลเพราะมีประสิทธิภาพมากกว่าที่คิด :-)
อย่างไรก็ตามหากคุณต้องการรวมสิ่งนี้ไว้ใน.bash_aliases
ไฟล์ของคุณจะต้องมีลักษณะดังนี้:
alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'
สังเกตการจัดการคำพูดเดียวหลายระดับที่ยุ่งยากมาก และไม่เป็นไปไม่ได้ที่จะใช้เครื่องหมายคำพูดคู่สำหรับsh -c
อาร์กิวเมนต์
strace -fc script
คุณสามารถตรวจสอบเรื่องนี้ด้วย รุ่นของคุณใช้สายระบบมากขึ้นประมาณ 70% +1 สำหรับรหัสสั้น :-)
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
find . -type f | cut -d"/" -f2 | uniq -c
แสดงรายการโฟลเดอร์และไฟล์ในโฟลเดอร์ปัจจุบันที่มีจำนวนไฟล์ที่พบใต้ IMO ที่รวดเร็วและมีประโยชน์ (ไฟล์ที่แสดงมีจำนวน 1)
| sort -rn
การเรียงลำดับย่อยตามจำนวนไฟล์
การใช้ find เป็นวิธีการที่แน่นอนหากคุณต้องการนับซ้ำ แต่ถ้าคุณต้องการนับจำนวนไฟล์โดยตรงภายใต้ไดเรกทอรีที่แน่นอน:
ls dir1 | wc -l
ls -d */ | xargs -n1 ls | wc -l
(ใช้คำตอบที่คุณยอมรับถ้ามันใช้งานได้แล้ว! นี่เป็นเพียงและตอนนี้คุณรู้.)
find
สำคัญมาก (ให้อยู่คนเดียว-print0
และxargs -0
ชี้ออกไปแล้วจากสกอตต์ในคำตอบอื่น ๆ )
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'
ฉันต้องการบ่อยครั้งที่ต้องนับจำนวนไฟล์ในไดเรกทอรีย่อยและใช้คำสั่งนี้ ฉันต้องการให้การนับปรากฏก่อน
สิ่งที่ฉันใช้ ... สิ่งนี้ทำให้อาร์เรย์ของไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีที่คุณให้เป็นพารามิเตอร์ พิมพ์ไดเรกทอรีย่อยและจำนวนของไดเรกทอรีย่อยเดียวกันนั้นจนกว่าไดเรกทอรีย่อยทั้งหมดจะถูกประมวลผล
#!/bin/bash
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))
for item in ${directories[*]}
do
if [ -d "$1$item" ]; then
echo "$1$item"
/bin/ls $1$item | /usr/bin/wc -l
fi
done
คุณสามารถใช้รหัสหลามนี้ บูตล่ามโดยการเรียกใช้python3
และวางสิ่งนี้:
folder_path = '.'
import os, glob
for folder in sorted(glob.glob('{}/*'.format(folder_path))):
print('{:}: {:>8,}'.format(os.path.split(folder)[-1], len(glob.glob('{}/*'.format(folder)))))
หรือเวอร์ชันเรียกซ้ำสำหรับการนับซ้อน:
import os, glob
def nested_count(folder_path, level=0):
for folder in sorted(glob.glob('{}/'.format(os.path.join(folder_path, '*')))):
print('{:}{:}: {:,}'.format(' '*level, os.path.split(os.path.split(folder)[-2])[-1], len(glob.glob(os.path.join(folder, '*')))))
nested_count(folder, level+1)
nested_count('.')
ตัวอย่างผลลัพธ์:
>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>> archive: 65
>>> html: 12
>>> py: 12
>>> src: 14
>>> reports: 1
>>> content: 6
>>> src: 1
>>> html_download: 1