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

У меня есть 535 папок (recup_dir.1, recup_dir.2, ..., recup_dir.535) и я хочу объединиться (объединение?) содержание тех папок в единственную папку (позволяет, говорит что названная папка recup_dir). Некоторые файлы могли бы иметь идентичные имена (как img.jpg), они, should't перезаписывают существующие (вместо этого они должны быть переименованы к чему-то как img1.jpg, img2.jpg и так далее...).

Существует ли способ сделать такую вещь с помощью командной строки?

2
задан 17 September 2014 в 12:11

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)

Для (гном-) терминал - "перетаскивают" функциональность:

Используйте ниже версии, сохраните ее, как описано выше (но ничего не изменяйте), и сделайте ее исполняемым файлом. Для использования его откройте окно терминала, перетащите сценарий по окну терминала, затем исходный каталог, продержитесь месту назначения. Команда Вы будете затем видеть в своем терминале:

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)
4
ответ дан 2 December 2019 в 01:38

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.

3
ответ дан 2 December 2019 в 01:38

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

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