Lệnh find . -name '*2015*' -mmin +1440 -ls
có thể sẽ làm những gì bạn muốn. Xem bên dưới để biết chi tiết.
Lệnh đầu tiên của bạn đã có -name 2015
. Nó không hoạt động vì nó chỉ tìm thấy các tệp có tên chính xác 2015
, không có ký tự nào khác trong đó.
Lệnh thứ hai của bạn find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
, có thể đã thất bại vì một vài lý do:
1. Các *
ký tự không trích dẫn được mở rộng bằng shell, sau đó được chuyển sang find
.
Nếu có bất kỳ tệp nào được chứa trực tiếp trong thư mục hiện tại ( tệp bạn đang chạy khi bạn chạy find ...
lệnh đó ) có tên chứa 2015
(và không bắt đầu bằng a .
), thì trình bao mở rộng *2015*
thành một danh sách các tên tệp đó, sau đó được chuyển danh sách đó là đối số để find
. Đây không phải là những gì bạn muốn - thay vào đó, bạn muốn vượt qua theo *2015*
nghĩa đen như một đối số để tìm, để find
, và không phải là vỏ, có thể tìm thấy các tệp phù hợp với nó.
Để khắc phục vấn đề đó, trích dẫn *2015*
. Có ba cách phổ biến để làm điều đó:
'*2015*'
(tức là find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)
"*2015*"
(tức là find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)
\*2015\*
(tức là find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)
Tôi đề nghị viết nó với dấu ngoặc đơn là '*2015*'
, bởi vì:
Nhưng trong trường hợp này nó không thực sự quan trọng. '
và "
cả hai đều đối xử *
như nhau và biểu thức không đủ phức tạp để \
trích dẫn để làm cho nó khó hiểu.
2. -mtime +1
chỉ chọn các tệp được sửa đổi hai hoặc nhiều ngày trước.
Như man find
nói:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
Giả sử một tập tin đã được sửa đổi 47 giờ trước. Để tìm hiểu có bao nhiêu khoảng thời gian 24 giờ, làm find
tròn xuống : đó là một khoảng thời gian 24 giờ trước. Nhưng -mtime +1
chỉ khớp với các tệp có thời gian sửa đổi nghiêm ngặt hơn một khoảng thời gian 24 giờ trước. Do đó, các tập tin từ ngày hôm qua không được khớp.
Xem Tại sao find -mtime +1 chỉ trả về các tệp cũ hơn 2 ngày? để biết thêm thông tin, theo đề xuất của thép .
Để tìm các tệp được sửa đổi lần cuối bất cứ lúc nào hơn 24 giờ trước , tôi đề nghị thay vì quy định nó là 1440 phút trước với -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Một số độc giả có thể tự hỏi tại sao tôi không trích dẫn {}
. Một số người trích dẫn {}
để nhắc nhở con người rằng đó không phải là một biểu hiện cho việc mở rộng niềng răng . Các vỏ kiểu Bourne (như bash ) không yêu cầu {}
không có gì bên trong để được trích dẫn. Có thể một số vỏ không phải kiểu Bourne đặc biệt đối xử với nó; đó có thể là lý do tại sao một số người dùng trích dẫn nó. Nhưng cũng có một quan niệm sai lầm rằng đôi khi người ta phải trích dẫn {}
để -exec
xử lý tên tệp với khoảng trắng một cách chính xác. Điều đó là sai: với {}
hoặc '{}'
, find
có cùng các đối số, vì trình bao loại bỏ các dấu ngoặc kép trước khi chuyển '{}'
đếnfind
. Để chống lại quan niệm sai lầm này, tôi không trích dẫn {}
, nhưng đó là vấn đề về phong cách - nếu bạn muốn {}
ghi lại cách thức vỏ không xử lý {
và }
đặc biệt, điều đó tốt.
Tôi khuyên bạn nên bạn cũng có thể thay đổi bạn ls
lệnh, hoặc (như muru đã gợi ý ) thay thế bằng find
's -ls
hành động. ls -ltrh
có thể không thực hiện những gì bạn dự định vì nó được chạy riêng cho từng tệp được tìm thấy và do đó, -t
và các -r
cờ, trong đó chỉ định sắp xếp, không liên quan.
Mặc dù đầu ra sẽ được định dạng khác một chút so với ls -l
, nhưng việc sử dụng -ls
đơn giản và dễ dàng hơn.
find . -name '*2015*' -mmin +1440 -ls
Hoặc nếu bạn quyết định bạn thực sự chỉ cần liệt kê tên của tệp (bao gồm cả đường dẫn của chúng, liên quan đến .
), bạn chỉ cần chỉ định không có hành động, khiến -print
hành động mặc định được sử dụng:
find . -name '*2015*' -mmin +1440
find
vẻ tốt với tôi, nhưng tôi cũng gặp vấn đề với-exec
tham số. Tôi cũng không thể làm việc đó được. (Tôi đã cố gắng để di chuyển tất cả các file jpg từ một thư mục vào thư mục mẹ của nó qua nó - và kết thúc làm việc đó bằng tay ...)