Как найти файлы одинакового размера между двумя каталогами и перезаписать файлы в первом каталоге файлами из второго?
У меня есть довольно интересная проблема, и я изо всех сил пытался найти решение. Ситуация такова:
У меня есть два каталога, содержащие множество файлов и папок (десятки тысяч). Некоторые файлы между этими двумя каталогами идентичны по размеру, но отличаются именами файлов, путями к файлам и содержимым. Мне нужно автоматически найти и заменить файлы одного размера в первом каталоге файлами из второго, игнорируя структуру каталогов и имена файлов второго каталога.
Я пытался использовать fdupes, а также другие подобные инструменты, но они сравнивают содержимое файлов, так что это не вариант.
Я пытался использовать gnome-search-tool, чтобы перечислить все файлы и отсортировать их по размеру, но заменять их вручную - это безумие, поскольку их тысячи.
Я изучал решение, представленное в https://stackoverflow.com/questions/7541616/how-to-find-files-with-same-size , но ни одно из них не соответствовало моим потребностям.
Может ли кто-нибудь указать мне правильное решение?
2 ответа
Я обычно синхронизирую свой жесткий диск с внешним, с кучей файлов и папок. Если вы не хотите возиться со скриптами, я рекомендую использовать супермощный и простой в использовании Freefilesync .
Есть несколько способов сравнить 2 папки по имени, размеру, содержимому, дате и т. д.
Скачать версию для линукса
Попробуйте это в файле сценария 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"
чтобы произошло настоящее копирование.
Пожалуйста, сначала прочитайте здесь дополнительную информацию и меры предосторожности.