Как объединить сотни папок с помощью командной строки

У меня 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.

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