Liệt kê các tệp không khớp với chuỗi đã cho trong tên tệp


15

Tôi có một thư mục chứa rất nhiều tệp (khoảng 200) với tên temp_log.$$được tạo với một số tệp quan trọng khác mà tôi cần kiểm tra.

Làm thế nào tôi có thể dễ dàng liệt kê ra tất cả các tệp và loại trừ các temp_log.$$tệp khỏi hiển thị?

Sản lượng dự kiến

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

Tôi đã đi qua lstrang người đàn ông nhưng không thể tìm thấy bất cứ điều gì trong tài liệu tham khảo này. Xin vui lòng cho tôi biết nếu tôi đã bỏ lỡ bất kỳ thông tin quan trọng ở đây.

Cảm ơn


trong BASH, ls --hide='temp_log.$$'nên làm việc. Bạn có thể / cũng nên mở rộng điều này bằng các ký tự đại diện, tùy thuộc vào phần nào của toàn bộ thuật ngữ temp_log.$$.
erch

Câu trả lời:


23

Với GNU ls(phiên bản trên Linux và Cygwin không được nhúng, đôi khi cũng được tìm thấy ở nơi khác), bạn có thể loại trừ một số tệp khi liệt kê một thư mục.

ls -I 'temp_log.*' -lrt

(lưu ý dạng dài -I--ignore='temp_log.*')

Với zsh, bạn có thể để shell thực hiện quá trình lọc. Vượt qua -dđể lstránh liệt kê nội dung của các thư mục phù hợp.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Với ksh, bash hoặc zsh, bạn có thể sử dụng cú pháp lọc ksh. Trong zsh, chạy setopt ksh_globtrước. Trong bash, chạy shopt -s extglobtrước.

ls -dltr !(temp_log.*)

Xin vui lòng, không trích dẫn trong ví dụ cho GNU ls: ls -I 'temp_log. *' -Lrt Chúng cần thiết để truyền mẫu cho lệnh và không để shell mở rộng nó.
shargors

Trên Ubuntu bash v4.3.48, nó sẽ -Itemp_log.*không có bất kỳ khoảng trống nào sau-I
Yan King Yin

1
@YanKingYin Không, thật tốt để có một không gian sau -I. Tuy nhiên, *cần phải được trích dẫn bằng cách này hay cách khác. -I temp_log.*không hoạt động nhưng -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, vv là tốt.
Gilles 'SO- ngừng trở nên xấu xa'

10

Bạn có thể sử dụng grepvới tùy chọn -v.

ls -lrt | grep -v <exclude-filename-part>

1
không chắc chắn tại sao điều này bị hạ cấp, đó là câu trả lời chính xác.
Tim Kennedy

5
Làm một grep trên đầu ra ls không phải lúc nào cũng đúng và không được khuyến khích. Nó có tác dụng phụ. Không thể nhớ lại các vấn đề chính xác. Ghi chú bên lề - phiếu bầu không phải từ tôi;)
mtk


3

Bạn có thể sử dụng findcho việc này:

find . \! -name 'temp_log*'

Điều này sẽ chỉ in tên, bạn có thể thêm -lsđể tạo ls -lđầu ra kiểu với dấu thời gian và quyền hoặc sử dụng -exec ls {} +để thực sự chuyển sang ls với bất kỳ tùy chọn nào bạn muốn cho cột, sắp xếp, v.v.

Tôi đã viết điều này giả sử đây chỉ là tập tin trong một thư mục. Nếu thư mục chứa các thư mục khác, bạn có thể muốn tránh liệt kê đệ quy chúng

find . \! -name 'temp_log*' -maxdepth 1

Và nếu bạn sử dụng ls, bạn sẽ muốn vượt qua tùy chọn -d để ngăn không cho liệt kê bên trong các thư mục:-exec ls -d {} +


Có lẽ -maxdepth 1cũng muốn bắt chước không đệ quy ls.
jw013

Đẹp. Người dùng có POSIX tối thiểu hơn findmà không -maxdepth cần xem tại đây .
tự đại diện

2

Tôi nghĩ rằng bạn muốn sử dụng một tính năng của vỏ, không phải của ls. Tôi sử dụng bash, vì vậy tôi đã kiểm tra những gì bạn muốn trong man bash. Tìm kiếm "^ MỞ RỘNG", (bằng cách nhấn '/' đầu tiên). Trích đoạn:

SỰ BÀNH TRƯỚNG

    Mở rộng được thực hiện trên dòng lệnh sau khi nó đã được chia thành các từ. Có nhiều loại bảy trong việc mở rộng thực hiện: mở rộng cú đúp , dấu ngã mở rộng , tham số và mở rộng biến , thay thế lệnh , mở rộng số học , tách từ , và mở rộng tên đường dẫn .

   ︙
... <snip> ...
   ︙

Mở rộng tên đường dẫn

    Sau khi chia tách từ, trừ khi -f tùy chọn đã được thiết lập, bash quét mỗi từ cho các nhân vật *, ?[. Nếu một trong những ký tự này xuất hiện, thì từ đó được coi là một mẫu và được thay thế bằng một danh sách tên tệp được sắp xếp theo thứ tự bảng chữ cái phù hợp với mẫu. Giáo dục

Gần đây tôi đã bắt đầu loại trừ các tệp dựa trên chữ cái đầu tiên của họ, với một lệnh như:

$ ls ./[^t]*

Điều này sẽ phù hợp với bất cứ điều gì không bắt đầu với chữ cái t. Nếu bạn thêm nhiều ký tự giữa các dấu ngoặc, thì bạn cũng loại trừ các tệp bắt đầu bằng các chữ cái đó.

Tìm kiếm một liên kết, và tôi có một liên kết tốt! Xem Khớp mẫu . Từ đó, điều này sẽ làm việc cho trường hợp của bạn:

$ ls -lrt ./!(temp_log.*)

Điều này đòi hỏi extglobtùy chọn shell được kích hoạt bằng cách sử dụng hàm shoptdựng sẵn ( shopt -s extglob), như đã nêu của Gilles .



-2

Vì các tệp mà bạn KHÔNG muốn in có "temp_log." trong tên tệp, sau đó lọc ra bằng grep:

ls -lrt | grep -v "temp_log."

LƯU Ý: Bài đăng khác có câu trả lời tương tự có thể bị hạ cấp vì người dùng không bao gồm dấu ngoặc kép "" xung quanh chuỗi mà grep nên tìm kiếm. Không có dấu ngoặc kép, nó không hoạt động như quảng cáo.


'LƯU Ý' của bạn không hoàn toàn chính xác. Có một số ký tự có thể cần được trích dẫn, nhưng tôi không nghĩ có bất kỳ ký tự nào trong chuỗi cụ thể đó.
hút thuốc 2345

cho đến khi có một người dùng hoặc nhóm có tên "temp_log" (dấu chấm trong regex sẽ khớp với một khoảng trắng hoặc bất cứ thứ gì sau đây temp_log. Đây không phải là cách tốt (chung) để loại trừ lskết quả.
Jeff Schaller

chỉ với -F, @ smokes2345; một khoảng thời gian sẽ khớp với bất kỳ ký tự nào trong biểu thức chính quy cơ bản. Xem: unix.stackexchange.com/q/119905/117549
Jeff Schaller
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.