Làm thế nào để liệt kê các tập tin bắt đầu với một người khác hoặc một người khác từ / etc. [đóng cửa]


10

Tôi đã thử ls /etc/[ac]*nhưng nó hiển thị các thư mục bắt đầu bằng a hoặc c và toàn bộ nội dung của chúng, không phải các tệp bắt đầu bằng " a " hoặc " c ".


thư mục là một trong nhiều loại tập tin . Những loại tệp nào bạn quan tâm (thông thường, symlink, thiết bị, đường ống, ổ cắm ...)?
Stéphane Chazelas

Không rõ liệu bạn bằng "thư mục" đang nói về nội dung của các thư mục, hoặc về chính tên thư mục. Lệnh mà bạn hiển thị sẽ liệt kê nội dung của các thư mục phù hợp với mẫu, với ls -d /etc/[ac]*bạn sẽ không nhận được nội dung của các thư mục phù hợp, nhưng vẫn sẽ thấy các tên thư mục. Không rõ liệu đây là những gì bạn muốn hoặc nếu bạn muốn tránh thậm chí liệt kê các tên thư mục.
Kusalananda

Câu trả lời:


23

Để tránh liệt kê nội dung của các thư mục, bạn có thể:

ls -d /etc/[ac]*

Điều đó sẽ liệt kê các tên thư mục cùng với các tên tệp thông thường bắt đầu bằng ahoặc c.

Để đầy đủ, một giải pháp không liên quan findcó thể là:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9

Việc đọc câu hỏi ban đầu của tôi cũng có ls -dvẻ phù hợp, nhưng dường như câu hỏi ban đầu chỉ định rằng không có thư mục nào được liệt kê, bất kể mở rộng hay không mở rộng.
Chris Xuống

1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9đừng phân tích ls.
Avinash Raj

1
@AvinashRaj: Chà, sự liên quan của lời khuyên đó phụ thuộc vào việc một người cần giải pháp này để làm việc một lần hay mãi mãi. Nếu chỉ một lần, thì phân tích cú pháp lslà trò chơi công bằng theo ý kiến ​​của tôi.
Greg Hewgill

3
Anh ấy có một điểm. Trong khi các tên trong /etcrất có thể là lành mạnh, một không gian đơn giản sẽ phá vỡ lscách tiếp cận vì số trường sẽ thay đổi. +1 cho ls -lddù.
terdon

1
Bạn cũng cần sửa miền địa phương ( LC_ALL=C), ngày không được đảm bảo có 3 trường ở các địa phương khác.
Stéphane Chazelas

7

Đệ quy:

find /etc -type f -name '[ac]*'

Nếu bạn yêu cầu không đệ quy, bạn có thể thực hiện việc này một cách hợp lý:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Hoặc cái này, không thể di chuyển được (GNU hoặc BSD gần đây):

find /etc -type f -maxdepth 1 -name '[ac]*'

Nếu bạn muốn làm trường hợp này một cách vô cảm, sử dụng -inamethay vì -name.


1
Lưu ý rằng đó -type flà cho các tập tin thường xuyên . Nếu thay vào đó bạn cần các tệp không phải thư mục, hãy thay thế bằng ! -type d(hoặc ! -xtype dbằng GNU findnếu bạn cũng muốn loại trừ các liên kết tượng trưng đến các thư mục).
Stéphane Chazelas

1

Bạn cũng có thể thử lệnh này,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'

1

Nếu bạn muốn cả hai tệp giám đốc (không phải nội dung của thư mục) và tệp, bạn có thể sử dụng printfbultin:

printf "%s\n" [ac]*

Thí dụ:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt

Làm thế nào điều này sẽ tránh các thư mục, như được yêu cầu trong câu hỏi?
Chris Xuống

Ôi, tôi đọc nhầm. Tôi nghĩ OP muốn thư mục nhưng không phải nội dung của nó.
cuonglm

Xin lỗi về chỉnh sửa đó, hoàn toàn đọc sai.
terdon

1

Không đệ quy mà không có find:

ls -pd /etc/[ac]* | grep -v '/$'

phần -pbổ sung /ở cuối cho các thư mục mà grepbộ lọc đưa ra. Tất nhiên không hoạt động đối với tên tệp có chứa các ký tự đặc biệt như dòng mới.


1

Với zsh:

print -rl /etc/[ac]*(.)

Sẽ liệt kê các tệp thông thường (như -type ftrong find) được liệt kê trong /etcđó tên bắt đầu bằng ahoặc c. Phần (xxx)ở cuối của một quả địa cầu là một tính năng dành riêng cho zsh được gọi là vòng loại toàn cầu. .như một vòng loại toàn cầu có nghĩa là tập tin thường xuyên .

Nếu quả cầu không khớp, zshsẽ hủy bỏ lệnh. Lưu ý rằng trong các shell giống như Bourne khác, nếu toàn cầu không khớp, mẫu sẽ tự mở rộng, do đó ls -d /etc/[ac]*có thể liệt kê không chính xác một tệp được gọi /etc/[ac]*nếu không có tệp nào bắt đầu bằng ahoặc ctrong /etc.

print -rl /etc/[ac]*(^/)

sẽ liệt kê các tệp không thuộc loại thư mục

print -rl /etc/[ac]*(-^/)

sẽ liệt kê các tệp không thuộc loại thư mục sau khi giải quyết các liên kết tượng trưng.


-3

Đối với các tệp hiển thị bắt đầu bằng:

ls etc |  grep ^a

Để hiển thị các tập tin bắt đầu bằng c:

ls etc |  grep ^c
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.