Điểm:-4

Cách đếm tất cả thư mục và thư mục con theo cách đệ quy thư mục

lá cờ in

Nhiệm vụ là: Kết quả khi chạy file sẽ là số thư mục con (đếm tất cả các thư mục con trong cây) trong thư mục vừa nhập.

Tôi biết cách đệ quy một thư mục bằng cách sử dụng -r nhưng làm cách nào tôi có thể đếm tất cả những số này trong tệp tập lệnh shell?

lá cờ us
Đây có phải là một bài tập về nhà?
lá cờ in
Vâng, đó là bài tập về nhà, và tôi đã tìm kiếm trên mạng nhưng không tìm thấy gì :(
Điểm:4
lá cờ hr

Để đếm tất cả các thư mục bao gồm cả những cái ẩn trong một cây bắt nguồn từ thư mục hiện tại . một trong hai

tìm thấy . -type d -printf '\n' | wc -l

hoặc

tìm thấy . -type d -printf x | wc -c

(bạn có thể thay thế bất kỳ ký tự đơn nào thay cho x: nếu bạn chọn một ký tự đặc biệt cho trình bao, hãy nhớ trích dẫn hoặc thoát ký tự đó). sử dụng printf '\n' | wc -l hoặc inf x | wc -c thay vì chuyển danh sách tên tệp tới wc -l sẽ đảm bảo số lượng là chính xác ngay cả khi có những thư mục có tên Lưu trữ dòng mới.

Cả hai lệnh bao gồm thư mục bắt đầu . trong số đếm - nếu bạn muốn đếm nghiêm ngặt phụcác thư mục sau đó trừ 1 hoặc thêm -tối thiểu 1

tìm thấy . -mindepth 1 -type d -printf '\n' | wc -l

hoặc dùng ! -Tên . để loại trừ . thư mục một cách rõ ràng.

Nếu bạn muốn loại trừ các thư mục ẩn (bao gồm cả các thư mục có thể không-hidden thư mục con của ẩn), sau đó cắt tỉa họ cũ

tìm -mindepth 1 -type d \( -name '.*' -prune -o -printf x \) | wc -c

Ngoài ra, sử dụng toàn cầu đệ quy của trình bao để duyệt qua cây. Sử dụng zsh chẳng hạn

dirs=( **/(ND/) )
in $#dirs

ở đâu (NĐ/)vòng loại toàn cầu điều đó làm cho **/ chỉ khớp với các thư mục và bao gồm ẩn ("Dot") - bỏ qua D nếu bạn chỉ muốn đếm các thư mục không ẩn.

Bạn có thể làm điều gì đó tương tự trong bash:

shopt -s nullglob dotglob globstar
đặt -f -- **/
printf '%d\n' "$#"

tuy nhiên không giống như của zsh / vòng loại, các **/ mẫu toàn cầu khớp với bất kỳ thứ gì trông giống như một thư mục - bao gồm các liên kết tượng trưng đến các thư mục.

lá cờ in
Cảm ơn bạn rất nhiều cho câu trả lời của bạn
lá cờ hr
@bac0n cảm ơn - đã thêm (và cập nhật các phần khác với -mindepth để đảm bảo tính nhất quán)
Điểm:1
lá cờ cn

thử chạy ls -l -R | grep -c ^d trong thiết bị đầu cuối của bạn từ thư mục bạn muốn biết có bao nhiêu bên trong.

*** chỉnh sửa *** Sử dụng bên dưới để quét với một đường dẫn thay đổi được nhắc cho người dùng.

#!/bin/bash
echo "Vui lòng nhập đường dẫn để quét:"
đọc đường dẫn
ls -l -R $path | grep -c ^d
lá cờ in
Đó chính xác là những gì tôi đang tìm kiếm
lá cờ in
Nhưng làm cách nào tôi có thể đặt đường dẫn tùy chỉnh tới thư mục?
Roxana avatar
lá cờ cn
Bạn có thể thêm đường dẫn lệnh như vậy ```ls -l -R /usr/share/themes | grep -c ^d ```. Bạn có thể thêm một biến như ```ls -l -R $path | grep -c ^d``` và có $path làm biến đầu vào cho tập lệnh của bạn.
lá cờ in
Cảm ơn bạn rất nhiều
sourav c. avatar
lá cờ cn
Nói chung, phân tích cú pháp đầu ra của `ls` là một ý tưởng tồi. Tôi sẽ không khuyến khích bất cứ ai. Xem https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-to-do-instead
Roxana avatar
lá cờ cn
Tôi đã chỉnh sửa câu trả lời của mình ở trên để hiển thị biến. Sourav không sai khi tránh phân tích cú pháp LS nhưng vì bạn KHÔNG tìm kiếm tên tệp, thay vì đếm các thư mục, điều đó không thành vấn đề. đó là một giải pháp đơn giản và sạch sẽ.
bac0n avatar
lá cờ cn
@Roxanna Nó vẫn sẽ gây ra sự cố, tin rằng chế độ không tương tác sử dụng nghĩa đen làm kiểu trích dẫn, điều đó có nghĩa là, e.i., `'folder'$'\n''d'` sẽ cho kết quả dương tính giả, hãy nghĩ rằng bất kỳ * phong cách trích dẫn * khác sẽ làm được.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.