Переместить файлы из специально названных папок / переместить файлы на один уровень вверх

Цель состоит в том, чтобы переместить файлы из папки самого низкого уровня, создать резервную копию одного каталога.

Это отлично работает, но перемещает файлы выше по иерархии папок.

find . -name '*.jpg' -type f -execdir mv '{}' ../ \;

Так что, если эти jpgs были размещены в папке под названием «фотографии», я хочу переместить их на один уровень, например)

../

Я попытался изменить параметр * .jpg, чтобы включить папку, и попытался использовать папку вместо точки после файла. Также пытались -maxdepth и -mindepth, но они не имели никакого эффекта.

РЕДАКТИРОВАТЬ: Это для нескольких папок, т. Е. Он должен проходить через весь диск.

3
задан 27 May 2015 в 15:58

4 ответа

Переместите файлы от самого низкого подкаталога один уровень

Сценарий ниже ищет каталог самый низкий подкаталог (= без подкаталогов) рекурсивно и перемещает все найденные файлы в папку (папки), один уровень, как буквально спросили относительно в целях состоит в том, чтобы переместить файлы из самой низкой папки уровня, создать резервную копию одного каталога:

#!/usr/bin/env python2
import shutil
import os
import sys

directory = sys.argv[1] 

for root, dirs, files in os.walk(directory):
    for dr in dirs:
        dr = root+"/"+dr
        # find folders without subfolders (= lowest level)
        if len(next(os.walk(dr))[1]) == 0:
            # direct superior directory
            up = dr[:dr.rfind("/")]
            # move files from lowest level one level up
            for f in os.listdir(dr):
                shutil.move(dr+"/"+f, up+"/"+f)

Использовать:

  1. Скопируйте сценарий в пустой файл, сохраните его как reorganize.py
  2. Выполните его командой:

    python /path/to/reorganize.py <directory_to_reorganize>
    

    Если название Вашего каталога (для реорганизации) содержит пробелы, используйте кавычки:

    python /path/to/reorganize.py '<directory_to_reorganize>'
    

Править

Как упомянуто в комментарии, с небольшим изменением, сценарий может использоваться, чтобы только переместить файлы с имени папки один уровень. moste эффективный путь состоит в том, чтобы сделать это непосредственно после

for dr in dirs:

Затем сценарий был бы:

#!/usr/bin/env python3
import shutil
import os
import sys

directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    for dr in dirs:
        if dr == "<folder_name>":
            dr = root+"/"+dr
            # direct superior directory
            up = dr[:dr.rfind("/")]
            # move files from lowest level one level up
            for f in os.listdir(dr):
                shutil.move(dr+"/"+f, up+"/"+f)
1
ответ дан 27 May 2015 в 15:58

Следующее переместит все .jpg файлы к их соответствующим родительским каталогам, если .jpg файлы только находятся под названным каталогом photos (могут быть несколько названный каталог photos):

find . -type f -path '*/photos/*' -not -path '*/photos/*/*' -name '*.jpg' \
-execdir mv -i {} .. \;

-path '*/photos/*' гарантирует, что путь будет содержать photos но файлы могут только быть под photos каталог (-not -path '*/photos/*/*').

Также обратите внимание что, если каталоги для не перемещения (нет photos) фиксируются и меньше в числах или имеет определенные шаблоны затем, Вы могли бы интересоваться -prune также.

1
ответ дан 27 May 2015 в 15:58

Если все Ваши конечные файлы находятся в каталогах, названных photos, Вы могли бы сделать что-то как:

find . -type d -name photos -exec bash -c 'cd {} && mv *jpg ../' \;

, Который будет искать названия каталогов photos, затем запустите оболочку удара, которая будет cd в каждого из них и перемещать весь .jpg файлы к родительскому каталогу.

0
ответ дан 27 May 2015 в 15:58

Будет находить самый низкий уровень в каждом ответвлении каталога и использовать его в качестве основы для Вашей находки и перемещать '*.jpg' один уровень.

#!/bin/bash

treedir="."
mapfile -d '' < <(find "$treedir" -depth -type d -print0)

L=""
A=()
for D in "${MAPFILE[@]}"; do
    [[ $L != $D/* ]] && A+=("$D"); L="$D"
done

for basedir in "${A[@]}"; do
    find "$basedir" -name '*.jpg' -type f -execdir mv -i -t .. '{}' \;
done
0
ответ дан 4 October 2019 в 14:25

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

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