Как объединить сотни папок с помощью командной строки
У меня 535 папок (recup_dir.1
, recup_dir.2
..., recup_dir.535
) и я хочу объединить (объединить?) содержимое этих папок в одну папку (скажем, папку с именем recup_dir
). Некоторые файлы могут иметь одинаковые имена (например, img.jpg
), они не должны перезаписывать существующие (вместо этого они должны быть переименованы во что-то вроде img1.jpg
, img2.jpg
и так далее...).
Есть ли способ сделать это с помощью командной строки?
2 ответа
Сценарий ниже перемещает все файлы из одного каталога, содержащего ваши 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)
Для (gnome-) терминала - функциональность "перетаскивания":
Используйте версию ниже, сохраните ее, как описано выше (но ничего не меняйте), и сделайте ее исполняемой. Чтобы использовать его, откройте окно терминала, перетащите скрипт на окно терминала, затем на исходный каталог, а затем на конечный пункт назначения. Команда, которую вы затем увидите в своем терминале:
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.