Tôi muốn liệt kê chỉ các thư mục trong đường dẫn được chỉ định ( ls
khô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?
Tôi muốn liệt kê chỉ các thư mục trong đường dẫn được chỉ định ( ls
khô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?
Câu trả lời:
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
ls -al | grep '^d'
- điều này ngắn gọn hơn nhiều.
*/
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 -F
tùy chọn ls
không được sử dụng. Tương tự như hành vi ls *php
và cách nó hiển thị tất cả các tệp kết thúc bằng php
một thư mục.
echo */
sẽ làm như vậy
Thử cái này:
find . -maxdepth 1 -type d
ls
giải pháp được đề xuất , find
chỉ 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.
find * -maxdepth 0 -type d
.
find
thường làm nhưng chỉ xuất các thư mục ở độ sâu 1.
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
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 *(/)
tree
?
tree
không được cài đặt theo mặc định (mặc dù nó nằm trong kho).
tree
lệnh không phải là lệnh unix gốc (vui lòng sửa cho tôi nếu tôi sai).
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
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
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'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
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ỉ grep
ra chúng:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepth
để thoát khỏi .
! 😁
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
.
Bạn có thể sử dụng tree
lệnh với công d
tắ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
tree
. Ồ, đó không phải là ý định của tôi để đánh cắp sấm sét của bất cứ ai.
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.
Đ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)
Đâ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
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: .*/
ls
là lệnh shell cho nội dung danh sách các thư mục hiện hành
-l
là 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)
-d
là 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.
Danh sách dài các thư mục
Danh sách thư mục
- ls -d * /