Làm thế nào để liệt kê các thư mục bằng cách sử dụng các lệnh bash?


52

Có cách nào để liệt kê chỉ các thư mục trong một thư mục bằng các lệnh bash không? (như lslệnh liệt kê tất cả các tệp và thư mục)

Câu trả lời:


66

Bạn có thể dùng:

ls -d -- */

Vì tất cả các thư mục kết thúc /, danh sách này chỉ liệt kê các thư mục trong đường dẫn hiện tại. Các -d tùy chọn đảm bảo rằng chỉ có tên thư mục được in, không phải nội dung của họ.


2
ls - * / liệt kê tất cả các thư mục có nội dung bên dưới
Vins

1
@ 8088 Sự khác biệt giữa ls -d -- */và là ls -d */gì?
Louis

5
@Louis, --thường được sử dụng để đánh dấu sự kết thúc của các tùy chọn, do đó, nếu một tệp có tên -lls sẽ không hiểu nó là tùy chọn định dạng danh sách dài.
Cristian Ciupitu

28

Phản hồi của Stephen Martin đã đưa ra cảnh báo và cũng liệt kê thư mục hiện tại, vì vậy tôi đề nghị

find . -mindepth 1 -maxdepth 1 -type d

(Đây là trên Linux; tôi không thể tìm thấy -maxdepth và -mindepth trong trang hướng dẫn POSIX để tìm)


1
Câu hỏi cũ hơn tôi biết. Mặc dù ban đầu tôi cũng sẽ chuyển sang tìm nhiệm vụ này, tôi thích ls -d -- */tùy chọn này, vì findcũng sẽ tìm thấy các lệnh trực tiếp ẩn. Mà đôi khi có thể hữu ích, nhưng đôi khi cũng gây rắc rối. Tôi hy vọng bình luận này có thể giúp đỡ người khác. +1
trận đấu

12
find . -maxdepth 1 -type d

Sẽ chỉ liệt kê các thư mục. Và như Teddy đã chỉ ra rằng bạn sẽ cần -maxdepth để ngăn chặn nó tái phạm vào các thư mục con


5
Bạn có thể muốn -maxdepth 1quá.
Teddy


1

Bạn "không được phép" phân tích đầu ra của ls, hay nói như vậy. Lý do đằng sau là đầu ra được dự định là có thể đọc được và con người có thể khiến nó trở nên phức tạp không cần thiết để phân tích, nếu tôi nhớ lại.

nếu bạn không muốn ls hoặc tìm, bạn có thể muốn thử lọc "*" bằng "[-d]".

Tôi đã làm điều đó, vì một số lý do ls và thấy không hoạt động (tên tệp có dấu cách và dấu ngoặc tôi đoán, hoặc một cái gì đó tôi đang nhìn), sau đó tôi đã làm gì đó dọc theo dòng

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done

0

Chỉ cần nhấn mạnh một điều làm tôi bối rối ở đây, liên quan đến lựa chọn mô hình toàn cầu; nói rằng bạn có điều này:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

Vì vậy, nói ở đây bạn muốn chỉ chọn mydir*thư mục. Lưu ý rằng nếu bạn bỏ dấu gạch chéo chấm dứt, ls -dcũng sẽ liệt kê các tệp:

$ ls -d testglob/mydir*   # also `ls -d -- testglob/mydir*`
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... tuy nhiên, với dấu gạch chéo chấm dứt, thì chỉ các thư mục được liệt kê:

$ ls -d testglob/mydir*/   # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/

0

printf "%s\n" */ sẽ liệt kê tất cả các thư mục trong $ PWD.

echo */ cũng sẽ hoạt động, nhưng trong một dòng dài, khó khăn hơn khi tên có khoảng trắng.


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.