tra-loi-cau-hoi-phat-trien-web.com

Làm thế nào để liệt kê các tập tin bị xóa gần đây từ một thư mục?

Tôi thậm chí không chắc chắn nếu điều này có thể dễ dàng, nhưng tôi muốn liệt kê các tệp gần đây đã bị xóa khỏi một thư mục, theo cách đệ quy nếu có thể.

Tôi đang tìm kiếm một giải pháp không yêu cầu tạo một tệp tạm thời chứa ảnh chụp nhanh cấu trúc thư mục gốc để so sánh, bởi vì quyền truy cập ghi có thể không phải lúc nào cũng có sẵn. Chỉnh sửa: Nếu có thể đạt được kết quả tương tự bằng cách lưu trữ ảnh chụp nhanh trong biến Shell thay vì tệp, điều đó sẽ giải quyết vấn đề của tôi.

Cái gì đó như:

find /some/directory -type f -mmin -10 -deletedFilesOnly

Chỉnh sửa: HĐH: Tôi đang sử dụng Ubuntu 14.04 LTS, nhưng các lệnh có thể sẽ chạy trong nhiều hộp Linux hoặc các thùng chứa Docker, hầu hết hoặc tất cả đều nên sử dụng ext4, và Tôi rất có thể sẽ không có quyền truy cập để thực hiện sửa đổi.

6
Marco Roy

Bạn có thể sử dụng tiện ích debugfs,

debugfs là một hệ thống tệp dựa trên RAM đơn giản để sử dụng được thiết kế đặc biệt [.__.] cho mục đích gỡ lỗi

Đầu tiên, chạy debugfs /dev/hda13 trong thiết bị đầu cuối của bạn (thay thế /dev/hda13 bằng đĩa/phân vùng của riêng bạn).

(LƯU Ý: Bạn có thể tìm thấy tên đĩa của mình bằng cách chạy df / trong thiết bị đầu cuối).

Khi ở chế độ gỡ lỗi, bạn có thể sử dụng lệnh lsdel để liệt kê các nút tương ứng với các tệp đã bị xóa.

Khi các tệp bị xóa trong linux, chúng chỉ không được liên kết nhưng các nút [.__

Để có đường dẫn trong số các tệp đã bị xóa này, bạn có thể sử dụng debugfs -R "ncheck 320236" thay thế số bằng nút inode cụ thể của mình.

Inode   Pathname
320236  /path/to/file

Từ đây, bạn cũng có thể kiểm tra nội dung của các tệp đã xóa bằng cat. (LƯU Ý: Bạn cũng có thể phục hồi từ đây nếu cần thiết).

Bài đăng tuyệt vời về điều này ở đây .

6
nextstep

Cảm ơn ý kiến ​​của bạn và câu trả lời các bạn. debugfs có vẻ như là một giải pháp thú vị cho các yêu cầu ban đầu, nhưng nó hơi quá mức cho giải pháp đơn giản và nhẹ nhàng mà tôi đang tìm kiếm; nếu tôi hiểu chính xác, kernel phải được xây dựng với sự hỗ trợ debugfs và thư mục đích phải nằm trong mount debugfs. Thật không may, điều đó sẽ không thực sự hiệu quả cho trường hợp sử dụng của tôi; Tôi phải có khả năng cung cấp một giải pháp cho các thư mục và hạt nhân "cơ bản" hiện có.

Vì điều này dường như không thể thực hiện được, tôi đã có thể thương lượng và nới lỏng các yêu cầu để liệt kê số lượng của các tệp gần đây đã bị xóa khỏi một thư mục, nếu có thể.

Đây là giải pháp tôi đã kết thúc thực hiện:

  1. Một lệnh find đơn giản được chuyển vào wc để đếm số lượng tệp gốc trong thư mục đích (đệ quy). Kết quả sau đó có thể dễ dàng được lưu trữ trong một biến Shell hoặc tập lệnh, mà không yêu cầu quyền truy cập ghi vào hệ thống tệp.

DEL_SCAN_ORIG_AMOUNT=$(find /some/directory -type f | wc -l)

  1. Sau đó chúng ta có thể chạy lại cùng một lệnh để có được số lượng tệp được cập nhật.

DEL_SCAN_NEW_AMOUNT=$(find /some/directory -type f | wc -l)

  1. Sau đó, chúng ta có thể lưu trữ sự khác biệt giữa hai trong một biến khác và cập nhật số tiền ban đầu.

DEL_SCAN_DEL_AMOUNT=$(($DEL_SCAN_ORIG_AMOUNT - $DEL_SCAN_NEW_AMOUNT)); [.__.] DEL_SCAN_ORIG_AMOUNT=$DEL_SCAN_NEW_AMOUNT

  1. Sau đó chúng tôi có thể in một tin nhắn đơn giản nếu số lượng tệp bị giảm.

if [ $DEL_SCAN_DEL_AMOUNT -gt 0 ]; then echo "$DEL_SCAN_DEL_AMOUNT deleted files"; fi;

  1. Quay trở lại bước 2.

Thật không may, giải pháp này sẽ không báo cáo bất cứ điều gì nếu cùng một lượng tệp đã được tạo và xóa trong một khoảng thời gian, nhưng đó không phải là vấn đề rất lớn cho trường hợp sử dụng của tôi.

Để phá vỡ điều này, tôi phải lưu trữ danh sách các tệp thực tế thay vì số lượng, nhưng tôi chưa thể thực hiện công việc đó bằng các biến Shell. Nếu bất cứ ai có thể tìm ra điều đó, tôi sẽ giúp tôi rất nhiều vì nó sẽ đáp ứng các yêu cầu ban đầu!

Tôi cũng muốn biết liệu có ai có ý kiến ​​về một trong hai cách tiếp cận này không.

0
Marco Roy