Hợp nhất hai thư mục trong Linux để có được tất cả các tệp duy nhất


1

Tôi phải vào thư mục, hãy gọi cho họ folder1folder2. Trong mỗi thư mục này là hình ảnh được đặt tên 1.jpg, 2.jpg vân vân

Thật không may, tập tin 1.jpg trong folder1 có thể là một hình ảnh khác hơn 1.jpg trong folder2. Hơn nữa, nó có thể là tập tin 1.jpg trong folder1 là hình ảnh tương tự như 42.jpg trong folder2. Vì vậy, tôi không thể sử dụng tên tệp để phân biệt các hình ảnh này.

Ý tưởng bây giờ là sử dụng hàm băm thay vì tên tệp.

Mục tiêu là hợp nhất cả hai thư mục trong một thư mục thứ ba, để thư mục đích chứa tất cả các hình ảnh duy nhất của cả hai thư mục.

Có một giải pháp đơn giản cho vấn đề này?

Câu trả lời:


0

Nếu bạn không quan tâm đến tên, trong mỗi thư mục, hãy di chuyển các tệp vào thư mục đích, đổi tên chúng sau hàm băm MD5 của chúng:

for f in folder1/* folder2/*;do mv -nv "$f" target/$(md5sum -b "$f" | cut -d ' ' -f 1); done

-n không thực sự cần thiết, nó ngăn chặn việc ghi đè tập tin đã di chuyển đầu tiên bằng một tập tin giống hệt thứ hai. Vì vậy, kết quả cuối cùng là với nó, các bản sao được để lại trong các thư mục nguồn của chúng và bạn có một ý tưởng về số lượng bản sao bạn đã có).

Sau đó, nếu cần, cung cấp cho họ một nhóm tên tùy ý khác (thực hiện trong target ):

ls | cat -n | while read n f; do mv "$f" "$n.extension"; done

(một lớp lót phía trên từ đây )


0

Tôi sẽ chạy một công cụ tìm tệp trùng lặp (có nhiều, chọn mục ưa thích của bạn) trên hai thư mục, để giảm chúng thành một bộ nội dung duy nhất. Sau đó đổi tên hàng loạt từ * đến folder1_* trong thư mục đầu tiên, tương tự thứ hai, để đảm bảo tên duy nhất. Sau đó hợp nhất hai với một di chuyển tập tin bình thường.


-1

Điều này sẽ làm điều đó, để điều chỉnh một chút dựa trên quy ước đặt tên của bạn và bạn mất tên gốc (nếu không bạn cần tìm hiểu phải làm gì nếu bạn có hai lần cùng tên với nội dung khác nhau).

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$hash ; done

Hoặc nếu bạn không muốn mất tên tệp gốc, chỉ cần thay đổi nó:

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$(echo $name | sed -e 's/\//_/') ; done

Có rất nhiều giả định được thực hiện cho đơn giản: không có đường dẫn có khoảng trắng, thực hiện mọi thứ trên đầu của cả hai thư mục, thực hiện đầu ra trong thư mục dest/ vv Nhiều thứ có thể được sửa chữa tùy thuộc vào yêu cầu cụ thể của bạn nhưng ở trên là một cơ sở làm việc.

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.