У меня есть 535 папок (recup_dir.1
, recup_dir.2
, ..., recup_dir.535
) и я хочу объединиться (объединение?) содержание тех папок в единственную папку (позволяет, говорит что названная папка recup_dir
). Некоторые файлы могли бы иметь идентичные имена (как img.jpg
), они, should't перезаписывают существующие (вместо этого они должны быть переименованы к чему-то как img1.jpg
, img2.jpg
и так далее...).
Существует ли способ сделать такую вещь с помощью командной строки?
Сценарий ниже перемещает все файлы из одного каталога, содержа Ваши 535 папок, (рекурсивно) в другой (единственный) каталог, сохраняя их исходное имя файла.
В случае дубликатов
(Только) в случае двойных названий, файлы будут переименованы к duplicate_1_[filename]
, duplicate_2_[filename]
и т.д.
Скопируйте сценарий ниже в пустой файл, сохраните его как rearrange.py
, установите корректные пути к источнику и месту назначения (каталоги) и выполните его:
python rearrange.py
Сценарий:
#!/usr/bin/env python
import os
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/sourcedirectory"
target_dir = "/path/to/destination"
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
n = 1; name_orig = name
while os.path.exists(target_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
newfile = target_dir+"/"+name; shutil.move(subject, newfile)
Используйте ниже версии, сохраните ее, как описано выше (но ничего не изменяйте), и сделайте ее исполняемым файлом. Для использования его откройте окно терминала, перетащите сценарий по окну терминала, затем исходный каталог, продержитесь месту назначения. Команда Вы будете затем видеть в своем терминале:
rearrange.py /path/to/source /path/to/destination
Нажмите возврат, и он сделан.
Сценарий:
#!/usr/bin/env python
import os
import shutil
import sys
# --------------------------------------------------------
reorg_dir = sys.argv[1]
target_dir = sys.argv[2]
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
n = 1; name_orig = name
while os.path.exists(target_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
newfile = target_dir+"/"+name; shutil.move(subject, newfile)
Если требуется сохранить текущий каталог нетронутым и только скопировать файлы в новый каталог, просто замените последнее (раздел) строка:
замена:
shutil.move(subject, newfile)
:
shutil.copy(subject, newfile)
sudo cp -r --backup=t recup_dir.*/* recup_dir
эта команда скопирует содержание всех 535 папок к recup_dir
и переименуйте существующие файлы к file.~1~ file.~2~ ..
535 папок и их содержание будут все еще существовать, если Вы захотите удалить их после копирования, просто добавляют && sudo rm -rf recup_dir.*
после первой команды, таким образом, это будет похоже:
sudo cp -r --backup=t recup_dir.*/* recup_dir && sudo rm -rf recup_dir.