Có một cách chính xác để liệt kê các thư mục con của thư mục hiện tại?


10

Tôi có thể tìm thấy các thư mục con của một thư mục bằng

ls -d -- */

hoặc là

ls -l | grep "^d"

nhưng cả hai điều này có vẻ gián tiếp, và tôi sẽ tưởng tượng rằng sẽ có một cách tiêu chuẩn để chỉ tìm các thư mục. Có một cách đúng đắn để làm điều này? Và nếu không, một trong hai sẽ dẫn đến hành vi không mong muốn trên các trường hợp cạnh? (Liên kết tượng trưng, ​​thư mục ẩn, v.v.)

Câu trả lời:


17

Câu trả lời sẽ phụ thuộc nhiều hơn vào những gì bạn định làm với đầu ra hơn là những gì bạn đang tìm kiếm. Nếu bạn chỉ muốn xem một danh sách để tham khảo trực quan tại thiết bị đầu cuối, giải pháp đầu tiên của bạn thực sự khá hay. Nếu bạn muốn xử lý đầu ra, bạn nên xem xét sử dụng phương pháp khác.

Một trong những cách mạnh mẽ nhất để đưa danh sách vào nguồn cấp dữ liệu khác là sử dụng find.

find -maxdepth 1 -type d

Lý do điều này tốt cho các nguồn cấp dữ liệu là findcó thể xuất dữ liệu được phân tách bằng null bằng cách sử dụng -print0hoặc thoát chuỗi đúng cách làm đối số cho các chương trình khác bằng cách sử dụng -exec. Để tham khảo về lý do tại sao đây là tốt hơn so với phân tích đầu ra của ls, xem ParsingLS trên Wiki của Greg.


4
Tôi đã phải gõ find . -maxdepth 1 -type dđể làm cho nó hoạt động trên OS X Yosemite.
Sean Levin

1
để liệt kê các thư mục con, người ta cũng phải chỉ định -mindepth như trong find . -maxdepth 1 -mindepth 1 -type d. Nếu không, thư mục hiện tại .sẽ được bao gồm.
tinlyx

5

FYI - Trong ZSH (nhưng không phải BASH), bạn cũng có thể làm điều này : ls -d -- *(/); công cụ (/)sửa đổi chỉ cho ZSH biết các thư mục toàn cầu.

Điều đó nói rằng, nó không khác lắm so với giải pháp đề xuất của riêng bạn ( ls -d -- */) và nó khác xa so với tiêu chuẩn.

Theo như đầu ra của ls(có thể khác nhau dựa trên các cờ khác):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2

zsh mở rộng dấu hoa thị cho tất cả các tệp và thư mục, cờ (/) chọn các phần của bản mở rộng đó để ls * (/) cũng hoạt động, cũng như echo * (/) hoặc in theo cách zshly hơn -l * (/ ) . Hai phiên bản đầu tiên cũng hoạt động trong bash.
Thor

1
Lưu ý rằng *(/)mở rộng đến các thư mục không bị ẩn trong khi */mở rộng sang các thư mục không ẩn hoặc liên kết tượng trưng đến thư mục (hoặc ít nhất là liên kết tượng trưng đến các đường dẫn mà chúng ta có thể nói rằng chúng là thư mục).
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.