Câu trả lời:
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ọ.
ls -d -- */
và là ls -d */
gì?
--
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 -l
ls sẽ không hiểu nó là tùy chọn định dạng danh sách dài.
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)
ls -d -- */
tùy chọn này, vì find
cũ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
Câu trả lời của Daniel là chính xác. Dưới đây là một số bổ sung hữu ích.
Để tránh liệt kê các thư mục ẩn (như .git
), hãy thử điều này:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \)
Và để thay thế dấu gạch chéo đáng sợ ở đầu find
ra trong một số môi trường, hãy sử dụng cách này:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
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
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 -d
cũ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/
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.
Bạn cũng có thể dùng:
du
Hoặc là:
git ls-tree -d -r --name-only @