Hoe kan ik bestanden van identieke grootte tussen twee mappen vinden en de bestanden in de eerste map overschrijven met die uit de tweede?

Ik heb een behoorlijk interessant probleem en ik heb moeite om een ​​oplossing te vinden. De situatie is als volgt:

Ik heb twee mappen met veel bestanden en mappen (tienduizenden). Sommige van de bestanden tussen deze twee mappen zijn identiek in grootte, maar verschillen in bestandsnaam, bestandspaden en inhoud. Ik moet automatisch bestanden van dezelfde grootte in de eerste directory zoeken en vervangen door die uit de tweede, waarbij ik de directorystructuur en bestandsnamen van de tweede directory negeer.

Ik heb geprobeerd om fdupes en andere vergelijkbare tools te gebruiken , maar ze vergelijken de bestandsinhoud, dus het is geen optie.

Ik heb geprobeerd de gnome-search-tool te gebruiken om alle bestanden weer te geven en ze op grootte te sorteren, maar ze handmatig vervangen is gek omdat er duizenden zijn.

Ik heb de oplossing onderzocht die wordt gepresenteerd in https://stackoverflow.com/questions/7541616/how-to-find-files-with-same-size, maar geen enkele kon aan mijn behoeften voldoen.

Kan iemand me naar de juiste oplossing wijzen?

2
задан 16 December 2020 в 20:25

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" для реального копирования.

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

0
ответ дан 17 December 2020 в 00:00

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

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

https://freefilesync.org/

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

0
ответ дан 19 December 2020 в 07:40

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

Похожие вопросы: