Mỗi thư mục trên một hệ thống Unix (và có lẽ mọi hệ thống khác cũng vậy) chứa ít nhất hai mục nhập thư mục. Đó là .
(thư mục hiện tại) và ..
(thư mục mẹ). Trong trường hợp thư mục gốc, các điểm này đến cùng một vị trí, nhưng với bất kỳ thư mục nào khác, chúng đều khác nhau. Bạn có thể thấy điều này cho chính mình bằng cách sử dụng stat
, pwd
và cd
các lệnh (trên Linux):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Lưu ý rằng bin
và sbin
mỗi có hai liên kết đến nó. Một là mục nhập thư mục trong thư mục gốc, và cái còn lại là .
mục bên trong thư mục đó.
Sử dụng ls
với một đường ống wc -l
là một mẹo đơn giản để đếm số lượng dòng trong đầu ra của ls. Giả định là mỗi tệp hoặc thư mục sẽ chiếm chính xác một dòng trong đầu ra. GNU ls sẽ, khi đầu ra là một thiết bị đầu cuối, sẽ tự động làm điều này; những người khác có thể cần -1
tùy chọn để bật hành vi một cách rõ ràng. wc -l
chỉ cần đếm và xuất số lượng dòng ( -l
) trong đầu vào của nó.
Vấn đề với cách tiếp cận đó là trong Linux và trên các hệ thống tệp thường được sử dụng trên Linux, tên tệp và thư mục (chúng thực sự là một và giống nhau về vấn đề này) được phép chứa các ký tự dòng mới . Với sự hiện diện của những cái đó, một trong hai phương thức sẽ bị tách ra - những mục đó sẽ được tính là hai hoặc nhiều mục khi trong thực tế chúng là một.
Miễn là bạn đang sử dụng GNU ls, không có mục nhập thư mục có tên chứa ký tự dòng mới và không có bí danh lẻ cho ls
(ví dụ ls -a
:), cả hai sẽ xuất số lượng tệp và thư mục trong thư mục hiện tại (hoặc được chỉ định). Đối với hầu hết mọi người, điều này là đủ tốt, nhưng nó không hợp lệ trong trường hợp chung .
Nếu bạn cần xử lý các ký tự bất thường (chủ yếu là dòng mới) trong tên mục nhập thư mục, tôi khuyên bạn nên sử dụng -b
tùy chọn ls để thoát chúng. ls -1bA
sẽ in mỗi tên mục nhập thư mục trên dòng riêng của nó, thoát các ký tự bất thường (vì vậy mỗi mục nhập thư mục sẽ được xem là một), bao gồm mọi dấu chấm và -directories. Xử wc -l
lý một dòng lệnh hoàn chỉnh ls -1bA | wc -l
sẽ báo cáo số lượng tệp và thư mục trong thư mục hiện tại (nhưng bỏ qua .
và ..
đó là sự khác biệt giữa -a
và -A
), nhưng không đi vào bất kỳ thư mục con nào. Nếu bạn không muốn bất kỳ dấu chấm nào được tính vào tổng số, chỉ cần bỏ qua -A
tham số ls
.