Tương đương với Linux của tên tệp DOS dir / s / b là gì?


17

Liệt kê tất cả các tệp / thư mục trong hoặc bên dưới thư mục hiện tại khớp với 'tên tệp'.

Câu trả lời:


28

Tương đương trực tiếp là

find . -iname <filename>

sẽ liệt kê tất cả các tệp và thư mục được gọi <filename>trong thư mục hiện tại và mọi thư mục con, bỏ qua trường hợp.

Nếu phiên bản tìm kiếm của bạn không hỗ trợ -iname, bạn có thể sử dụng -namethay thế. Lưu ý rằng không giống như -iname, -namelà trường hợp nhạy cảm.

Nếu bạn chỉ muốn liệt kê các tệp được gọi <filename>và không phải thư mục, hãy thêm-type f

find . -iname <filename> -type f

Nếu bạn muốn sử dụng ký tự đại diện, bạn cần đặt dấu ngoặc kép xung quanh nó, vd

find . -iname "*.txt" -type f

nếu không thì vỏ sẽ mở rộng nó.

Như những người khác đã chỉ ra, bạn cũng có thể làm:

find . | grep "\.txt$"

grep sẽ in các dòng dựa trên các biểu thức thông thường, mạnh hơn các ký tự đại diện, nhưng có một cú pháp khác.

Xem man findman grepđể biết thêm chi tiết.


3
Nếu <filename>có chứa ký tự đại diện, hãy sử dụng dấu ngoặc kép quanh nó, vd find . -name '*.txt'.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles, cập nhật câu trả lời của tôi để nói rằng, cảm ơn.
Mikel

2
Sử dụng <filename>làm điểm đánh dấu cho userinput là một thói quen xấu trong môi trường dòng lệnh, trong đó < and >hầu hết thời gian có ý nghĩa cụ thể. Tôi đề nghị chỉ sử dụng filename, có thể PHIM để nhấn mạnh nó. Hầu hết mọi người sẽ hiểu, và những người, những người sẽ không, có thể gây hại khi không hiểu rằng họ không nên đánh ít hơn hoặc lớn hơn dấu hiệu.
người dùng không xác định

2
<filename>là một quy ước trong rất nhiều tài liệu UNIX, vì vậy tôi nghĩ nó hữu ích cho mọi người biết về nó, nhưng tôi đồng ý FILENAMEcó thể dễ hiểu hơn.
Mikel

1
find -iname <filename>là tốt hơn vì nó không phân biệt chữ hoa chữ thường như DOS
Agnel Kurian

8

Một số vỏ cho phép ls **/filename, khá thuận tiện.


1
Điểm tốt. Trong các phiên bản gần đây của bash, chạy shopt -s globstar; echo **/filenametương đương với find . -name "filename". Nó cũng hoạt động trong zsh.
Mikel

'Ls ** / filename` này là tốt, nhưng dường như không đi sâu hơn một cấp độ thư mục.
Sopalajo de Arrierez

@ sopalajo-de-arrierez Nếu bạn làm như vậy shopt -s globstar, nó có thể sẽ làm việc cho bạn. Globing đệ quy là một tính năng chỉ có sẵn trong một số shell và đôi khi, nó không được bật theo mặc định.
Shawn J. Goff

Ops ... Tôi hiểu rồi, @ ShawnJ.Goff: shoptlệnh cho phép tùy chọn globstar on. Bây giờ nó hoạt động như một nét duyên dáng. Cảm ơn rất nhiều.
Sopalajo de Arrierez

4

Bạn có thể làm điều này với

find . | egrep filename

1
Bạn cũng có thể thực hiện trong một với find . -regextype posix-egrep -regex '.*filename.*'(Tôi không biết egrepphần đó có quan trọng không, nhưng bạn đã sử dụng egreptrong câu trả lời của mình nên tôi đã đưa nó vào)
Michael Mrozek

Bạn có thể, nhưng grep khác với lệnh DOS tương đương. grepsử dụng các biểu thức thông thường, trong khi lệnh DOS sử dụng các ký tự đại diện.
Mikel

1
Hãy nghĩ về nó, các vỏ sò cũng khác với các ký tự đại diện của DOS. Chẳng hạn, find . -name "*.*"sẽ không làm những gì bạn mong đợi từ nền DOS. Quả cầu đủ gần để có thể nhận ra, mặc dù, trong khi regex là một con thú hoàn toàn mới.
Jander

Làm gì *.*.*trong một dos hiện đại tức là windows cmd? Thế còn *.*.*.*?
ctrl-alt-delor

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.