Câu trả lời:
Giả sử bạn chỉ muốn số lượng tệp đệ quy, không phải thư mục và các loại khác, một cái gì đó như thế này sẽ hoạt động:
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$':'
bạn có được danh sách DESC
Nhiệm vụ này mê hoặc tôi đến mức tôi muốn tự mình tìm ra giải pháp. Nó thậm chí không có một vòng lặp while và CÓ THỂ được nhanh hơn về tốc độ thực thi. Không cần phải nói, những nỗ lực của Thor đã giúp tôi rất nhiều để hiểu mọi thứ một cách chi tiết.
Vì vậy, đây là của tôi:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
Nó có vẻ khiêm tốn vì một lý do, vì nó mạnh hơn vẻ ngoài của nó. :-)
Tuy nhiên, nếu bạn có ý định đưa cái này vào .bash_aliases
tập tin của mình thì nó phải giống như thế này:
alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'
Lưu ý việc xử lý rất khó khăn của dấu ngoặc đơn lồng nhau . Và không, không thể sử dụng dấu ngoặc kép cho sh -c
đối số.
strace -fc script
. Phiên bản của bạn thực hiện thêm khoảng 70% các cuộc gọi hệ thống. +1 cho mã ngắn hơn :-)
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
Liệt kê một thư mục và tệp trong thư mục hiện tại với số lượng tệp được tìm thấy bên dưới. IMO nhanh chóng và hữu ích. (tập tin hiển thị với số 1).
| sort -rn
để sắp xếp các thư mục con theo số lượng tệp.
Sử dụng find chắc chắn là cách tốt nhất nếu bạn muốn đếm đệ quy, nhưng nếu bạn chỉ muốn đếm số lượng tệp trực tiếp trong một thư mục nhất định:
ls dir1 | wc -l
ls -d */ | xargs -n1 ls | wc -l
(Tuy nhiên, hãy sử dụng câu trả lời bạn đã chấp nhận nếu nó đã hoạt động! Đây chỉ là Và Bây giờ bạn biết.)
find
rất quan trọng. (hãy để một mình -print0
và xargs -0
, đã được Scott chỉ ra trong câu trả lời khác)
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'
Tôi cần thường xuyên phải đếm số lượng tệp trong thư mục con của tôi và sử dụng lệnh này. Tôi thích số lượng xuất hiện đầu tiên.
Những gì tôi sử dụng ... Điều này tạo ra một mảng của tất cả các thư mục con trong thư mục bạn cung cấp làm tham số. In thư mục con và số lượng của thư mục con đó cho đến khi tất cả các thư mục con được xử 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
Bạn có thể sử dụng mã python này. Khởi động trình thông dịch bằng cách chạy python3
và dán này:
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)))))
Hoặc một phiên bản đệ quy cho số lượng lồng nhau:
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('.')
Ví dụ đầu ra:
>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>> archive: 65
>>> html: 12
>>> py: 12
>>> src: 14
>>> reports: 1
>>> content: 6
>>> src: 1
>>> html_download: 1