Xóa các tệp có cùng kích thước nhưng giữ luôn một tệp?


1

Tôi có một thư mục chứa đầy zipfiles, chứa nhiều tệp. Chúng được tạo bởi phần mềm và điều này hiện không thể sửa được. Tôi đã cố gắng làm việc với fdupes, nhưng quá trình này mất quá nhiều thời gian, vì có khoảng 50k tệp. Tôi biết rằng tất cả các tệp có cùng kích thước là trùng lặp mà không có ngoại lệ.

Vì vậy, làm thế nào bây giờ tôi có thể xóa tất cả các tập tin vô dụng? Tôi đã có lệnh này in cho tôi các tệp để giữ, nhưng tôi không biết làm thế nào để chuyển đổi nó trong một oneliner để sử dụng nó như là cronjob.

find . -type f -printf "%s %p\n" | grep "zip" | sort -n | uniq -d --check-chars=10

-rw-r--r--  1 root root 2550472 Apr 22 14:40 save_2016-04-22-14_40_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 14:45 save_2016-04-22-14_45_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 14:50 save_2016-04-22-14_50_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 14:55 save_2016-04-22-14_55_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:00 save_2016-04-22-15_00_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:05 save_2016-04-22-15_05_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:10 save_2016-04-22-15_10_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:15 save_2016-04-22-15_15_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:20 save_2016-04-22-15_20_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:25 save_2016-04-22-15_25_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:30 save_2016-04-22-15_30_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:35 save_2016-04-22-15_35_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:40 save_2016-04-22-15_40_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:45 save_2016-04-22-15_45_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:50 save_2016-04-22-15_50_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:55 save_2016-04-22-15_55_01.zip #keep
-rw-r--r--  1 root root 2556836 Apr 22 16:00 save_2016-04-22-16_00_01.zip
-rw-r--r--  1 root root 2556836 Apr 22 16:05 save_2016-04-22-16_05_01.zip #keep
-rw-r--r--  1 root root 2586848 Apr 22 16:10 save_2016-04-22-16_10_01.zip
-rw-r--r--  1 root root 2586848 Apr 22 16:15 save_2016-04-22-16_15_01.zip
-rw-r--r--  1 root root 2586848 Apr 22 16:20 save_2016-04-22-16_20_01.zip #keep
-rw-r--r--  1 root root 2590213 Apr 22 16:25 save_2016-04-22-16_25_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:30 save_2016-04-22-16_30_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:35 save_2016-04-22-16_35_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:40 save_2016-04-22-16_40_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:45 save_2016-04-22-16_45_01.zip #keep

Lệnh trên in một cái gì đó như thế:

2590215 ./save_2016-04-25-14_20_01.zip
2590216 ./save_2016-04-25-14_00_01.zip
2590259 ./save_2016-05-17-13_10_01.zip
2590278 ./save_2016-05-17-13_35_01.zip
2590286 ./save_2016-05-17-13_50_01.zip
2590291 ./save_2016-05-17-14_25_01.zip
2590294 ./save_2016-05-17-13_55_01.zip

Bất kỳ ý tưởng? Tôi cũng không có quyền cài đặt thêm phần mềm, chỉ có các lệnh có sẵn như đối với máy chủ Ubuntu 14.04.2 LTS.

Câu trả lời:


1

Vì bạn đã có lệnh giữ tập tin nào, bạn có thể kết hợp điều này với lệnh di chuyển mv. Chỉ cần di chuyển chúng sang thư mục khác (quặng cung cấp cho chúng một tiền tố khác), xóa các tệp còn lại và di chuyển chúng trở lại.

Hãy xem -ttham số của mv. Bạn có thể sử dụng điều này để chỉ định đích và sau đó dẫn nhiều tệp đến mv.


Tôi đã chỉnh sửa câu hỏi của mình, nhưng như bạn nói, tôi có thể thoát khỏi kích thước tệp và hơn cả đường dẫn đến danh sáchmv
CodeBrauer

Đúng. Lệnh sẽ là | grep -o "./.*"(giả sử tên tệp của bạn sẽ không bao giờ chứa "/")
masgo

Tôi chỉ cần thêm điều này | awk '{ print $2 }' | xargs mv -t final/và nó đã làm việc. cảm ơn.
CodeBrauer

awk cũng tốt, tôi chỉ không quen thuộc với nó.
masgo

Cảm ơn grep - Tôi luôn sử dụng grep để tách hàng và awk để tách cột. Khá dễ dàng và mạnh mẽ.
CodeBrauer

0

Nó có thể không quan trọng, nhưng bạn nên lưu ý rằng hai khóa có thể khác nhau ngay cả khi kích thước của chúng bằng byte. Nếu bạn muốn thoát khỏi sự nguy hiểm này, bạn có thể kiểm tra md5sum của các tệp. Vẫn không đảm bảo 100% chỉ xóa các bản sao nhưng cơ hội của bạn sẽ tốt hơn rất nhiều.

Đây là một cách để làm điều đó bằng cách sử dụng awk để gửi tên tệp đến xargs để xóa (mẫu với các tệp của tôi):

$ ls -l [a-d][1-3].txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 a1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 a2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 a3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 b1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 b2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 b3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 c1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 c2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 c3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 d1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 d2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 d3.txt
$ md5sum [a-d][1-3].txt | sort -k1 | awk '$1==prevsum {print $2}; {prevsum=$1}' | xargs  rm
$ ls -l [a-d][1-3].txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 a1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 a2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 a3.txt

Vì tôi không quan tâm đến kích thước tệp và tôi biết mẫu đặt tên của tệp, tôi thậm chí không phải sử dụng find.


Vâng, điều này sẽ tốt hơn, nhưng tôi biết rằng các tệp của tôi luôn khác nhau về kích thước byte. Điều này là do mỗi zip chứa một filetree cụ thể và 1 hoặc 2 tệp trở nên lớn hơn - đó là nó. Tôi muốn nó được thực hiện nhanh nhất có thể, bởi vì máy không mạnh đến thế. Ngay cả việc kiểm tra md5 cũng sẽ mất nhiều thời gian;)
CodeBrauer
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.