Cách tìm kiếm tất cả các tệp theo ngày đệ quy trong Linux

Tác giả sysadmin, T.M.Hai 30, 2022, 02:00:40 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách tìm kiếm tất cả các tệp theo ngày đệ quy trong Linux


Bạn đã bao giờ muốn xem danh sách tất cả các tệp hoặc thư mục con trong một thư mục trong Linux và sắp xếp chúng theo thời điểm chúng được thay đổi hoặc sửa đổi lần cuối chưa? Vậy bạn đã đến đúng chỗ! Ở đây chúng tôi sẽ cung cấp và giải thích một số lệnh hữu ích mà khi kết hợp với nhau sẽ cho chúng tôi kết quả này, cho phép chúng tôi liệt kê đệ quy các tệp và thư mục theo ngày.

Đây là một trong những lệnh yêu thích của tôi để sử dụng khi cố gắng xây dựng dòng thời gian của các sự kiện, chẳng hạn như nếu một máy chủ hoặc trang web đã bị xâm phạm và bạn muốn xem khi nào các tệp đã bị sửa đổi với nội dung độc hại. Bằng cách xem các tệp khác đã được sửa đổi trong cùng khoảng thời gian, bạn có thể hiểu rõ hơn về những gì đã diễn ra và khi nào, cho phép bạn liên hệ các sự kiện này với nhật ký của mình.

1. Các lệnh

Vì vậy, đây là các lệnh đơn giản được kết hợp với nhau, hãy chạy lệnh này trong một thư mục và bạn sẽ được cung cấp danh sách tất cả các tệp và thư mục con cùng với ngày chúng được sửa đổi lần cuối. Nội dung được thay đổi gần đây nhất sẽ ở cuối danh sách, vì vậy sau khi chạy nó, bạn sẽ thấy những thay đổi gần đây nhất cùng với những thay đổi cũ hơn khi bạn cuộn lên. Nếu bạn có nhiều đường ống đầu ra, hãy chuyển toàn bộ lô thành 'ít hơn' để bạn có thể dễ dàng cuộn qua.

Mã nguồn [Chọn]
find. -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-
Dưới đây là một ví dụ đầu ra từ việc chạy lệnh đầy đủ này.

Mã nguồn [Chọn]
# find. -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-
Wed Aug 26 09:25:04.0000000000 2015./images/1.jpg
Tue Sep  1 06:27:43.0000000000 2015./1.JPG
Sat Sep 12 12:36:51.0000000000 2015./directory/6.jpg
Sat Sep 12 12:43:48.0166880221 2015./directory
Mon Oct 12 05:18:21.0000000000 2015./images/7.jpg
Sun Oct 18 08:29:46.0000000000 2015./8.jpg
Wed Oct 21 10:50:16.0672628610 2015./index.html

Như được hiển thị, chúng ta có thể thấy các tệp được sắp xếp từ ngày và giờ cũ nhất được sửa đổi thành mới nhất. Bây giờ hãy chia nhỏ những gì từng phần thực sự đang làm cho chúng ta.

2. Lệnh Find

Trước hết, lệnh find được chạy để tìm cho chúng ta danh sách tất cả các tệp và thư mục con theo cách đệ quy trong thư mục làm việc hiện tại, như được chỉ định bởi "." sau lệnh tìm. Để xác nhận thư mục làm việc hiện tại của bạn, bạn có thể chạy lệnh "pwd". Bạn có thể thay đổi dấu "." thay vào đó là một đường dẫn thư mục đầy đủ để liệt kê tất cả các tệp và thư mục con trong đó nếu được yêu cầu, theo cách này, bạn không cần phải ở trong thư mục.

Cờ "-printf" được sử dụng để in đầu ra ở định dạng được chỉ định, trong trường hợp này là '% T@ %t %p\n'. % T@ hiển thị thời gian kỷ nguyên, đó là số giây kể từ ngày 1 tháng 1 năm 1970, %t hiển thị thời gian sửa đổi lần cuối của tệp, %p hiển thị tên tệp trong khi \n chỉ đơn giản là một dòng mới để mỗi kết quả là đầu ra của chúng tôi hiển thị trên một dòng mới giúp dễ đọc và làm việc hơn.

Điều đáng chú ý là bạn cũng có thể thay thế %t bằng %c, thay vào đó sẽ sử dụng thời gian thay đổi trạng thái cuối cùng của tệp thay vì thời gian sửa đổi. Điều này sẽ hiển thị những thứ như thay đổi quyền không thực sự sửa đổi tệp nội dung nhưng thay đổi siêu dữ liệu.

Đầu ra của lệnh find này trông như thế này.

Mã nguồn [Chọn]
1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015./index.html
Ở giai đoạn này, đầu ra không hiển thị theo bất kỳ thứ tự thời gian nào. Chúng ta có thể thấy đầu ra được hiển thị như mong đợi, thời gian kỷ nguyên của tệp theo sau là ngày và giờ sửa đổi lần cuối, tiếp theo là tên tệp.

3. Lệnh Sort

Bây giờ với kết quả này, bạn có thể nhận thấy rằng không có thứ tự nào được áp dụng, điều này được xử lý bằng lệnh sắp xếp. Cờ -k chỉ định vị trí bắt đầu trong trường hợp này là 1, cột đầu tiên là thời gian kỷ nguyên.

Đầu ra với sắp xếp được hiển thị bên dưới, bây giờ chúng ta có các tệp theo thứ tự như đầu ra của chuỗi lệnh đầy đủ được hiển thị trước đó sau khi sắp xếp theo cột 1, thời gian kỷ nguyên. Vì thời gian kỷ nguyên là tất cả các số, chúng tôi cũng sử dụng -n để thực hiện sắp xếp dựa trên số.

Mã nguồn [Chọn]
1440581104.0000000000 Wed Aug 26 09:25:04.0000000000 2015./images/1.jpg
1441088863.0000000000 Tue Sep  1 06:27:43.0000000000 2015./1.JPG
1442061411.0000000000 Sat Sep 12 12:36:51.0000000000 2015./directory/6.jpg
1442061828.1668802210 Sat Sep 12 12:43:48.0166880221 2015./directory
1444627101.0000000000 Mon Oct 12 05:18:21.0000000000 2015./images/7.jpg
1445156986.0000000000 Sun Oct 18 08:29:46.0000000000 2015./8.jpg
1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015./index.html

Chúng tôi có thể thay đổi -n thành -nr sẽ đảo ngược đầu ra, dẫn đến các tệp đã sửa đổi cũ nhất hiển thị ở cuối đầu ra, thay vì mới nhất.

4. Lệnh Cut

Bây giờ chúng ta đã sắp xếp đầu ra, chúng ta sử dụng lệnh cắt để sắp xếp và in ra một lựa chọn cụ thể hơn. Bằng cách chỉ định một dấu phân cách với -d của '' chúng tôi tìm thấy khoảng trắng đầu tiên xuất hiện sau thời gian Epoch và cắt mọi thứ sau đó.

Tại thời điểm này, chúng tôi hiện có đầu ra hoàn chỉnh liệt kê tất cả các tệp theo ngày theo cách đệ quy từ thư mục đã chỉ định. Thời gian kỷ nguyên cung cấp một cách dễ dàng để thực hiện sắp xếp, nhưng chúng tôi không thực sự cần thấy điều đó trong kết quả cuối cùng vì nó không phải là con người có thể đọc được nên nó đã bị xóa sau khi sắp xếp.

5. Sự lựa chọn khác

Tất nhiên, bạn luôn có thể sử dụng "ls -lrt" đơn giản hơn nhiều trong một thư mục để xem tất cả các tệp trong thư mục làm việc hiện tại từ cũ nhất đến mới nhất, tuy nhiên điều này không tính đến nội dung thư mục con. Ngay cả khi chúng tôi sử dụng tùy chọn đệ quy và sử dụng "ls -lRrt", chúng tôi chỉ thấy các tệp được sắp xếp dựa trên ngày trong mỗi thư mục và không phải là sự kết hợp của tất cả các thư mục con.

Nếu bạn không quan tâm đến chính các thư mục con, bạn cũng có thể thêm "-type f" vào lệnh find, lệnh này sẽ chỉ liệt kê các tệp, như minh họa bên dưới.

Mã nguồn [Chọn]
find. -type f -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-
Điều này vẫn liệt kê các tệp trong thư mục con, đơn giản là nó không còn hiển thị tên thư mục con trong đầu ra.

Điều ngược lại cũng có thể được thực hiện bằng cách sử dụng "-type d" sẽ chỉ hiển thị các thư mục và không có tệp.

Mã nguồn [Chọn]
find. -type d -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-
Bằng cách kết hợp một vài lệnh bash tương đối đơn giản trong Linux, chúng tôi đã có thể liệt kê thành công tất cả các tệp và thư mục con trong một thư mục đã chỉ định theo cách sửa đổi hoặc ngày thay đổi của chúng, theo thứ tự tăng dần hoặc giảm dần. Chúng tôi cũng có thể tùy chọn chỉ định để chỉ xem các tệp hoặc thư mục trong đầu ra.

Lệnh này là một cách tuyệt vời để xây dựng dòng thời gian của các sự kiện vì đầu ra theo trình tự thời gian cho phép chúng tôi xem thứ tự sửa đổi tệp, bất kể tệp thực sự nằm ở đâu.