У меня есть папка размером в 700 ГБ, и некоторые из этих файлов являются дубликатами. Многие из них имеют одинаковое имя, некоторые дублируются, некоторые нет. По сути, у меня около 30 папок внутри этой папки, заполненных файлами и еще папками. Я хочу рекурсивно захватить все файлы в этой папке размером в 700 ГБ и скопировать их нерекурсивно в другой каталог. Любые конфликты будут обрабатываться на основе размера. Если два файла имеют одинаковое имя и одинаковый размер, файл пропускается, но если два файла имеют одинаковое имя и разный размер, оба файла сохраняются. Как я могу это сделать?
решение1
Сложный вопрос, так как дубликаты приходится переименовывать, но такжепереименовандубликаты должны быть проверены по размеру на предмет всех их (возможно) ранее переименованных «собратьев».
Что оно делает
Насколько я могу судить (и тестировать), скрипт ниже это делает. Он переименовывает возможные дубликаты в [dupe_1]<file>
и [dupe_1]<file>
т. д. (если они разного размера) и проверяет после каждого переименования, совпадает ли размер файла с перемещенным дубликатом или его переименованными версиями в целевом каталоге.
#!/usr/bin/env python3
import shutil
import os
#--- set the directory, the same as the first script
dr = "/path/to/recursive/source_directory"
dr2 = "/path/to/flat/target_directory"
#---
def check_dupe(src, trg):
return os.stat(src).st_size == os.stat(trg).st_size
for root, dirs, files in os.walk(dr):
for file in files:
# define src, target
src = root+"/"+file; trg = dr2+"/"+file
if not os.path.exists(trg):
# if target does not exist: move file
shutil.copy(src, trg)
else:
n = 1
# rename the file, check after every renaming if file exists, if size differs
while os.path.exists(trg):
test = check_dupe(src, trg)
if test != True:
trg = dr2+"/[dupe_"+str(n)+"]"+file
n += 1
else:
break
if test != True:
shutil.copy(src, trg)
Как использовать
- Скопируйте скрипт в пустой файл, сохраните его как
reorganize.py
- В разделе «head» скрипта укажите пути к исходному и целевому каталогу.
Запустите его командой:
python3 /path/to/reorganize.py
Примечания
- Пожалуйста, сначала протестируйте на небольшом образце.
- Имейте в виду, что это может создатьогромный«плоский» каталог, который не будет доступен для просмотра Nautilus.
решение2
попробуй это:
cd [folder_name]
for file in ./*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
do
if [ -e [destination_folder]/"$file" ]; then
if [ `du -s "$file" | cut -d ' ' -f 1` -eq `du -s [destination_folder]/"$file" | cut -d ' ' -f 1` ]; then
false
else
cp "$file" [destination_folder]/"$file"...
fi
else
cp "$file" [destination_folder]/
fi
echo "$file copied"
done