Chỉ liệt kê các thư mục trong UNIX


219

Tôi muốn liệt kê chỉ các thư mục trong đường dẫn được chỉ định ( lskhông có tùy chọn như vậy). Ngoài ra, điều này có thể được thực hiện với một dòng lệnh không?


12
Trong tương lai: Có thể loại câu hỏi cơ bản unix / linux không quá khó liên quan đến lập trình sẽ tốt hơn ở đó: unix.stackexchange.com
echox

Câu trả lời:


315

Hãy thử điều này ls -d */để liệt kê các thư mục trong thư mục hiện tại


17
Này, điều đó thật tiện lợi, tôi luôn quen với chúng tôi ls -al | grep '^d'- điều này ngắn gọn hơn nhiều.
paxdiablo

43
tại sao sử dụng * / ?? vui lòng giải thích!?
Chandeep

6
Tôi không có một lời giải thích phù hợp, tuy nhiên tôi biết rằng việc */buộc chỉ hiển thị các mục kết thúc bằng dấu gạch chéo về phía trước, trong trường hợp này sẽ là một thư mục, ngay cả khi -Ftùy chọn lskhông được sử dụng. Tương tự như hành vi ls *phpvà cách nó hiển thị tất cả các tệp kết thúc bằng phpmột thư mục.
David Hancock

3
@ user975234 Ai đó đã hỏi một câu hỏi tương tự, và có một lời giải thích khá hay được đăng liên kết
user1766760

17
Cũng echo */sẽ làm như vậy
nos

95

Thử cái này:

find . -maxdepth 1 -type d

8
Đối với tôi điều này có vẻ là cách nó nên được thực hiện. Không giống như các lsgiải pháp được đề xuất , findchỉ chịu trách nhiệm thực hiện công việc (không dựa vào việc mở rộng ký tự đại diện, có thể áp đặt các giới hạn). Nó cũng ngắn gọn hơn rất nhiều.
peterp

1
Điều tệ hại về điều này là nó không hoạt động nếu bạn đang cố gắng lặp lại kết quả và kết quả của bạn có khoảng trắng trong tên.
ubiquibacon

2
Ngoài ra, nếu bạn không muốn bao gồm chính thư mục : find * -maxdepth 0 -type d.
James Ko

@ubiquibacon Hoặc sử dụng find's -print0hoặc -exectùy chọn.

1
Điều này thực sự rất chậm, ít nhất là trên máy Mac của tôi. Nó dường như thực hiện tìm kiếm đệ quy đầy đủ findthường làm nhưng chỉ xuất các thư mục ở độ sâu 1.
Kara Brightwell

22

Sau đây

find * -maxdepth 0 -type d

về cơ bản lọc mở rộng '*', tức là tất cả các mục trong thư mục hiện tại, theo -type dđiều kiện.

Ưu điểm là, đầu ra giống như ls -1 *, nhưng chỉ với các thư mục và mục không bắt đầu bằng dấu chấm


13

Bạn có thể sử dụng ls -d */hoặctree -d

Một giải pháp khác sẽ là toàn cầu hóa nhưng điều này phụ thuộc vào trình bao bạn đang sử dụng và nếu hỗ trợ toàn cầu cho các thư mục.

Ví dụ: ZSH:

zsh # ls *(/)

3
Với hương vị nào của Unix bạn nhận được tree?
Johnsyweb

tất cả các bản phân phối linux chính chẳng hạn? xin lỗi, tôi không nhận được câu hỏi?
echox

1
Tôi có một bản phân phối Debian và treekhông được cài đặt theo mặc định (mặc dù nó nằm trong kho).
Stephen Schrauger

1
Downvote vì tôi tin rằng treelệnh không phải là lệnh unix gốc (vui lòng sửa cho tôi nếu tôi sai).
Tiago Cardoso

10

Vì có hàng tá cách để làm điều đó, đây là một cách khác:

tree -d -L 1 -i --noreport
  • -d: thư mục
  • -L: độ sâu của cây (do đó 1, thư mục làm việc của chúng tôi)
  • -i: không thụt lề, chỉ in tên
  • --noreport: không báo cáo thông tin ở cuối danh sách cây

Và cảm ơn bạn đã giải thích các thiết bị chuyển mạch. Stack Overflow là về câu trả lời, tôi luôn đánh giá cao khi mọi người làm giống như bạn với một lời giải thích so với "chỉ cần đọc mục nhập của người đàn ông!" <- đó không phải là một câu trả lời.
fusion27

Để bắt đầu từ dòng 2 (bỏ qua dòng chỉ có một dấu chấm):tree -d -L 1 -i --noreport | tail -n +2
adius

Đây là giải pháp được xếp hạng cao nhất liệt kê các thư mục được liên kết mềm và thực hiện theo cách hữu ích, hiển thị chúng dưới dạng liên kết. Tôi thích các biến thể:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel

9
ls -l | grep '^d'

Bạn có thể tạo bí danh và đặt nó vào tệp hồ sơ

alias ld="ls -l| grep '^d'"

1
liên kết không được xem với lệnh này. Và một liên kết có thể là một tập tin hoặc một thư mục. Ví dụ: lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> / lib / init / upstart-job.
c-toesca

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

Tìm. -maxdepth 1 -type d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: không tìm thấy kết quả phù hợp: [^.] *
Michael Cole

6

Để liệt kê các thư mục trong thư mục làm việc hiện tại ls -d */có thể được sử dụng. Và nếu bạn cần liệt kê các thư mục ẩn, hãy sử dụng lệnh này ls -d .*/


6

sử dụng cái này để lấy danh sách thư mục

ls -d */ | sed -e "s/\///g"

ls -d <custom-thư mục-path> | sed -e "s / \ /// g" không hoạt động .. nhiều manh mối?
Dhwanit

Cảm ơn bạn! Tôi chỉ muốn danh sách thư mục mà không có tất cả các quyền và điều này đã lừa. :)
mã hóa

5

find specifiedpath -type d

Nếu bạn không muốn lặp lại trong các thư mục con, bạn có thể thực hiện việc này thay thế:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Lưu ý rằng các thư mục "chấm" (có tên bắt đầu bằng .) cũng sẽ được liệt kê; nhưng không phải là thư mục đặc biệt .cũng không ... Nếu bạn không muốn thư mục "chấm", bạn có thể chỉ grepra chúng:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
Upvote đã đề cập mindepthđể thoát khỏi .! 😁
adius

5

Câu trả lời sẽ phụ thuộc vào vỏ của bạn .

Trong zsh, ví dụ, bạn có thể làm như sau:

echo *(/)

Và tất cả các thư mục trong thư mục làm việc hiện tại sẽ được hiển thị.

Xem man zshexpnđể biết thêm thông tin.

Một cách tiếp cận khác là sử dụng find(1), phương pháp này sẽ hoạt động trên hầu hết các hương vị Unix:

find . -maxdepth 1 -type d -print  

find(1)có nhiều công dụng, vì vậy tôi chắc chắn khuyên bạn nên man find.


4

Bạn có thể sử dụng treelệnh với công dtắc của nó để thực hiện điều này.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

xem man treeđể biết thêm


Tôi không downvote, chỉ có cùng một câu hỏi. Có vẻ như câu trả lời của bạn là một bản sao của echox, có lẽ đó là lý do?.
Louis Waweru

1
@Louis - cảm ơn tôi thậm chí không bao giờ nhận thấy đề cập đến của anh ấy tree. Ồ, đó không phải là ý định của tôi để đánh cắp sấm sét của bất cứ ai.
slm

nâng cao khả năng hình dung của cây gì
Andrejs

Tôi tin rằng các downvote là bởi vì đó là một câu trả lời giống như stackoverflow.com/a/3667405/523742
Tiago Cardoso

@TiagoCardoso - của tôi có trước 2 năm.
slm

2

Nếu tôi có thư mục này:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Để có được tất cả các thư mục, sử dụng -L để giải quyết các liên kết:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Không có -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

thư mục conf_nagios bị thiếu.


2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

1

Điều này đã làm việc cho tôi:

`ls -F | grep /`

(Nhưng, tôi đang chuyển sang echo */như được đề cập bởi @nos)


1

Đây là một giải pháp khác cho thấy các thư mục được liên kết. Tôi hơi thích nó bởi vì nó là một tập hợp con của đầu ra ls "bình thường":

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

Trong bash:

ls -d */

Sẽ liệt kê tất cả các thư mục

ls -ld */

sẽ liệt kê tất cả các thư mục ở dạng dài

ls -ld */ .*/

sẽ liệt kê tất cả các thư mục, bao gồm các thư mục ẩn, ở dạng dài.


Gần đây tôi đã chuyển sang zsh (MacOS Catalina) và thấy rằng:

ls -ld */ .*/

không còn hoạt động nếu thư mục hiện tại không chứa thư mục ẩn.

zsh: no matches found: .*/

Nó sẽ in lỗi trên, nhưng cũng sẽ không in bất kỳ thư mục nào.

ls -ld *(/) .*(/)

Cũng thất bại theo cách tương tự.

Cho đến nay tôi đã thấy rằng:

ls -ld */;ls -ld .*/

là một cách giải quyết tốt. Đây ;là một dấu phân cách lệnh. Nhưng nó có nghĩa là nếu không có thư mục ẩn, nó sẽ liệt kê các thư mục và vẫn in lỗi không có thư mục ẩn:

foo
bar
zsh: no matches found: .*/

lslà lệnh shell cho nội dung danh sách các thư mục hiện hành
-llà cờ để xác định rằng bạn muốn danh sách trong Longford (mỗi mục một dòng + một bó thông tin thú vị khác)
-dlà lá cờ để liệt kê tất cả các thư mục "dưới dạng tệp" và không đệ quy
*/là đối số 'liệt kê tất cả các tệp kết thúc bằng dấu gạch chéo'
*là một lệnh regex đơn giản cho "mọi thứ", do đó, */yêu cầu shell liệt kê "mọi thứ kết thúc bằng '/'"

Xem man lsđể biết thêm thông tin.


Tôi đặt cái này:

alias lad="ls -ld */;ls -ld .*/"

trong .zshrc của tôi và nó có vẻ hoạt động tốt.

LƯU Ý: Tôi cũng đã phát hiện ra rằng

ls -ld .*/ 2> /dev/null

không hoạt động, vì nó vẫn in sterr đến thiết bị đầu cuối. Tôi sẽ cập nhật câu trả lời của mình nếu / khi tôi tìm ra giải pháp.


0

du -d1có lẽ là lựa chọn ngắn nhất. (Miễn là bạn không cần chuyển đầu vào sang lệnh khác.)


0

Để chỉ liệt kê các thư mục trong một đường dẫn cụ thể, chỉ cần gõ ls -l | grep drw


Điều này có thể bao gồm các tệp, nếu bất kỳ tên tệp nào bao gồm drwvà sẽ loại trừ bất kỳ thư mục nào không thể đọc được và có thể ghi được. grep ^dlàm việc tốt hơn
Tom Zych

0

Danh sách dài các thư mục

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Danh sách thư mục
- ls -d * /


Bạn có bất kỳ lý do tốt để sao chép câu trả lời đã có?
Maxim Sagaydachny
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.