2013-02-05 22 views
13

Tôi có một tập hợp các tệp trong một thư mục. Tôi cần phải tìm tệp cho một tập hợp các ngày cụ thể (Ví dụ: nếu tôi cần tệp từ ngày 16 tháng 1 đến ngày 20 tháng 1). Tôi đã thử sử dụng ls -ltr | grep <date> nhưng thực hiện quá nhiều bước để thực hiện việc chọn tệp. Có cách nào dễ dàng hơn để hoàn thành công việc này không. Cảm ơn!Cách sử dụng ls để tìm tệp cho một tập hợp ngày cụ thể trong Unix

+0

Shash, có một suy nghĩ về câu trả lời được chấp nhận, tôi nghĩ tìm có thể là một công cụ tốt hơn cho công việc. – paxdiablo

+0

@paxdiablo Ok., Sẽ thử thậm chí là – Shash

Trả lời

20

Tôi không chắc chắn có bao nhiêu dữ liệu mà bạn có trong bạn thư mục nhưng một cái gì đó như thế này nên được blindingly nhanh:

ls -al | awk '$6 == "Jan" && $7 >= 16 && $7 <= 20 {print $9}' 

Trên hệ thống của tôi, tôi thấy những điều sau với một chút thay đổi ngày :

pax> ls -al | awk '$6 == "Jan" && $7 >= 16 && $7 <= 29 {print $9}' 
kids_shares.ods 
our_savings.gnumeric 
photos 

pax> ls -ald kids_shares.ods our_savings.gnumeric photos 
-rw-r--r-- 1 pax pax 51005 Jan 29 19:39 kids_shares.ods 
-rw-r--r-- 1 pax pax 2275 Jan 28 14:48 our_savings.gnumeric 
drwxrwxrwx 130 pax pax 4096 Jan 29 21:47 photos 

Bạn có thể thấy ngày phù hợp với các tệp đã cho.

Một điều cần lưu ý: nếu tệp gần đây, nó sẽ có thời gian trong cột 8. Ngoài một số tuổi, ls bắt đầu đặt năm ở đó. Tôi có hồi tưởng mơ hồ rằng nó ở đâu đó xung quanh biên giới sáu tháng tuổi nhưng tôi không hoàn toàn chắc chắn. Bạn sẽ cần phải phục vụ cho điều đó là tốt.

+1

làm việc tuyệt vời ... – Shash

9

Sử dụng find(1) thay vào đó, điều đó sẽ dễ dàng hơn nhiều.

find . -mtime -$start -mtime +$end 
+0

'tìm' có cờ' -newer' (để xem nếu nó mới hơn một tệp khác) nhưng tiếc là không phải là một '-older'. Tôi không chắc nó phù hợp với những phạm vi ngày rất cụ thể này. – paxdiablo

+0

@paxdiablo nó là phù hợp, tôi chỉ cần thêm một ví dụ (cũng có, tìm có '!' (Không) nhà điều hành) – wich

+0

Ooh, tôi đã không nghĩ về điều đó. Cuộc gọi tốt. – paxdiablo

7

Bạn nên sử dụng find. Bắt đầu bằng cách tạo hai tệp tạm thời với thời gian cụ thể để tìm kiếm giữa. touch thể làm điều này:

touch -t "201301160001" ./start 
touch -t "201301202359" ./finish 

Sau đó chạy find:

find /path/to/files -type f -newer ./start ! -newer ./finish 
+0

Thực ra, cả hai giải pháp dựa trên tìm kiếm này có lẽ tốt hơn so với tôi - chỉ cần sử dụng maxdepth nếu bạn không muốn đi vào các thư mục con. 1 cho cả hai. – paxdiablo

+0

@paxdiablo: Cảm ơn bạn đời. Tôi đáp lại bởi vì (mặc dù tôi không muốn phân tích đầu ra 'ls') OP _did_ muốn nó làm theo cách đó, và 'awk' là một lựa chọn tốt. – Steve

+0

Điều này làm việc tuyệt vời cho tôi một cách tương tác nhưng không trả lại kết quả nào khi được sử dụng trong một tập lệnh (hoặc bằng './Script.sh',' bash script.sh' hoặc 'source script.sh'). Tôi nghĩ nó liên quan đến vụ nổ; khi tôi sử dụng 'bash -x' để gỡ lỗi, nó được bao quanh với dấu nháy đơn; chạy lệnh theo cách này sẽ không trả về gì cả. – rensa

Các vấn đề liên quan