Как найти файлы одинакового размера между двумя каталогами и перезаписать файлы в первом каталоге файлами из второго?

У меня есть довольно интересная проблема, и я изо всех сил пытался найти решение. Ситуация такова:

У меня есть два каталога, содержащие множество файлов и папок (десятки тысяч). Некоторые файлы между этими двумя каталогами идентичны по размеру, но отличаются именами файлов, путями к файлам и содержимым. Мне нужно автоматически найти и заменить файлы одного размера в первом каталоге файлами из второго, игнорируя структуру каталогов и имена файлов второго каталога.

Я пытался использовать fdupes, а также другие подобные инструменты, но они сравнивают содержимое файлов, так что это не вариант.

Я пытался использовать gnome-search-tool, чтобы перечислить все файлы и отсортировать их по размеру, но заменять их вручную - это безумие, поскольку их тысячи.

Я изучал решение, представленное в https://stackoverflow.com/questions/7541616/how-to-find-files-with-same-size , но ни одно из них не соответствовало моим потребностям.

Может ли кто-нибудь указать мне правильное решение?

2 ответа

Я обычно синхронизирую свой жесткий диск с внешним, с кучей файлов и папок. Если вы не хотите возиться со скриптами, я рекомендую использовать супермощный и простой в использовании Freefilesync .

Есть несколько способов сравнить 2 папки по имени, размеру, содержимому, дате и т. д.

https://freefilesync.org/

Скачать версию для линукса

Попробуйте это в файле сценария bash:

      #!/bin/bash

dir1="/REPLACE/THIS/WITH/FULL/PATH/TO/dir1/"
dir2="/REPLACE/THIS/WITH/Full/PATH/TO/dir2/"

echo "Indexing $dir2 ... Please wait ..."

find "$dir2" -type f -follow -exec ls -l {} \; > "dir2_ls_file.txt"

while read f1 f2 f3 f4 f5 f6 f7 f8 f9
                do
                        size="${f5}"
                        name="${f9}"
                        result0=$(find "$dir1" -type f -size "$size"c -follow)
                        result1=$(echo "$result0" | wc -l)
                        result2=$(find "$dir2" -type f -size "$size"c -follow | wc -l)
                                if [ $result2 -gt 1 ]; then
                                        echo "There is more than one file under $dir2 with the same size as $name , so no action is taken!"
                                elif [ $result1 -eq 1 ] && [ "$result0" ]; then
                                        echo "$result0 is the same size as $name , so it will be replaced."
                                #       cp "$name" "$result0"
                                else
                                        echo "There is more than one file or no file under $dir1 with the same size as $name , so no action is taken!"
                                fi
                done < "dir2_ls_file.txt"

Если вы довольны результатом, снимите комментарий cp "$name" "$result0"чтобы произошло настоящее копирование.

Пожалуйста, сначала прочитайте здесь дополнительную информацию и меры предосторожности.

Другие вопросы по тегам