it-swarm-vi.com

Làm cách nào tôi có thể nhận được số lượng tệp trong một thư mục bằng dòng lệnh?

Tôi có một thư mục với một số lượng lớn các tập tin. Tôi không thấy công tắc ls để cung cấp số đếm. Có một số phép thuật dòng lệnh để có được một số lượng các tập tin?

219
Blake

Sử dụng định nghĩa rộng của "tập tin"

ls | wc -l

(lưu ý rằng nó không tính các tệp ẩn và giả sử rằng tên tệp không chứa ký tự dòng mới).

Để bao gồm các tệp ẩn (ngoại trừ ...) và tránh các vấn đề với các ký tự dòng mới, cách chính tắc là:

find . ! -name . -Prune -print | grep -c /

Hoặc đệ quy:

find .//. ! -name . -print | grep -c //
279
James Roth

Đối với định nghĩa hẹp của tập tin:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
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: Lưu ý ls - <số một> | wc - <thư-l>

15
nicomen

Tôi đã tìm thấy du --inodes hữu ích, nhưng tôi không chắc phiên bản nào của du nó yêu cầu. Nó sẽ nhanh hơn đáng kể so với các phương pháp thay thế bằng cách sử dụng findwc.

Trên Ubuntu 17.10, các công việc sau:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Kết hợp với | sort -nr để sắp xếp giảm dần theo số lượng nút chứa.

12
krlmlr

Có lẽ câu trả lời đầy đủ nhất bằng cách sử dụng cặp ls/wc

ls -Aq | wc -l

nếu bạn muốn đếm tập tin dấu chấm, và

ls -q | wc -l

nếu không thì.

  • -A là để đếm các tập tin dấu chấm, nhưng bỏ qua ....
  • -q make ls thay thế các ký tự không rõ ràng, cụ thể là ký tự dòng mới, bằng ?, tạo 1 dòng đầu ra cho mỗi tệp

Để nhận đầu ra một dòng từ ls trong thiết bị đầu cuối (tức là không có đường ống vào wc), -1 tùy chọn phải được thêm vào.

(hành vi của ls được thử nghiệm với coreutils 8.23)

12
Frax

Nếu bạn biết thư mục hiện tại chứa ít nhất một tệp không bị ẩn:

set -- *; echo "$#"

Điều này rõ ràng là khái quát cho bất kỳ toàn cầu.

Trong một kịch bản, điều này đôi khi có tác dụng phụ đáng tiếc là ghi đè các tham số vị trí. Bạn có thể giải quyết vấn đề đó bằng cách sử dụng một lớp con hoặc với một hàm (phiên bản Bourne/POSIX) như:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

Một giải pháp thay thế là $(ls -d -- * | wc -l). Nếu toàn cầu là *, Lệnh có thể được rút ngắn thành $(ls | wc -l). Phân tích cú pháp đầu ra của ls luôn khiến tôi thấy khó chịu, nhưng ở đây nó sẽ hoạt động miễn là tên tệp của bạn không chứa dòng mới hoặc ls thoát khỏi chúng. Và $(ls -d -- * 2>/dev/null | wc -l) có lợi thế xử lý trường hợp một quả cầu không khớp một cách duyên dáng (nghĩa là nó trả về 0 trong trường hợp đó, trong khi phương thức set * Yêu cầu kiểm tra một cách khéo léo nếu quả cầu có thể trống ).

Nếu tên tệp có thể chứa các ký tự dòng mới, một cách khác là sử dụng $(ls -d ./* | grep -c /).

Bất kỳ giải pháp nào dựa trên việc chuyển mở rộng toàn cầu sang ls đều có thể thất bại với danh sách đối số quá dài nếu có nhiều tệp phù hợp.

Trong khi sử dụng cặp ls/wc nếu chúng ta thêm -U, nó sẽ nhanh hơn nhiều (không sắp xếp).

ls -AqU | wc -l
5
Jbnair

Sau khi cài đặt lệnh cây, chỉ cần gõ:

tree

Nếu bạn cũng muốn ẩn các tập tin:

tree -a

Nếu bạn đang sử dụng Debian/Mint/Ubuntu Linux, hãy gõ lệnh sau để cài đặt lệnh cây:

Sudo apt-get install tree

Tùy chọn -L được sử dụng để chỉ định mức hiển thị tối đa của cây thư mục. Lệnh cây không chỉ đếm số lượng tệp, mà còn cả số lượng thư mục, xem xét bao nhiêu cấp độ của cây thư mục tùy thích.

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 sẽ làm cho nó không đệ quy, find được đệ quy theo mặc định
  • -type f sẽ chỉ bao gồm các tệp
  • -printf . là một liên lạc dễ thương. nó in một dấu chấm cho mỗi tệp thay vì tên tệp và bây giờ điều này có thể xử lý bất kỳ tên tệp nào và cũng lưu dữ liệu; chúng ta chỉ cần đếm số chấm :)
  • | wc -c đếm ký tự
3
aude

Không có đường ống, không có bản sao chuỗi, không có ngã ba, chỉ đơn giản là bash một lớp lót

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

Trên Linux, để làm cho lệnh rất mạnh mẽ và xử lý các tệp có thể có dòng mới trong tên của chúng, hãy sử dụng:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

Điều này giúp chúng tôi tiết kiệm từ thử thách phân tích cú pháp ls.


Liên quan:

1
codeforester

Đây là một kỹ thuật khác dọc theo dòng một Gilles đã đăng :

Word_count () { local c=("[email protected]"); echo "${#c[@]}"; }
file_count=$(Word_count *)

tạo ra một mảng với 13.923 phần tử (nếu đó là có bao nhiêu tệp).

find . -type f -maxdepth 1 |  wc -l 

Điều này chỉ có thể liệt kê các tập tin trong thư mục hiện tại.

1
srpatch

Cải thiện một số câu trả lời được đưa ra trước đây nhưng lần này làm rõ ràng.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

Thật đáng để chú ý đến việc sử dụng một số lệnh yêu thích như tailcut. Ngoài ra, lưu ý rằng cây không có sẵn theo mặc định. Lệnh trên nắm bắt thông tin đầu tiên về thư mục ở cấp 1, sau đó lấy dòng cuối cùng tail -n 1 nơi mục tiêu của chúng tôi là và kết thúc bằng cut để nhận Word thứ ba.

Chẳng hạn, định vị trong /:

/ $ 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

Sau đó, những gì về số lượng thư mục?

0
jonaprieto

Hãy thử điều này tôi hy vọng câu trả lời này sẽ giúp bạn

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Bạn có thể kiểm tra với:

ls -l | grep -v ^l | wc -l
0
AMIC MING