Цель состоит в том, чтобы переместить файлы из папки самого низкого уровня, создать резервную копию одного каталога.
Это отлично работает, но перемещает файлы выше по иерархии папок.
find . -name '*.jpg' -type f -execdir mv '{}' ../ \;
Так что, если эти jpgs были размещены в папке под названием «фотографии», я хочу переместить их на один уровень, например)
../
Я попытался изменить параметр * .jpg, чтобы включить папку, и попытался использовать папку вместо точки после файла. Также пытались -maxdepth и -mindepth, но они не имели никакого эффекта.
РЕДАКТИРОВАТЬ: Это для нескольких папок, т. Е. Он должен проходить через весь диск.
Сценарий ниже ищет каталог самый низкий подкаталог (= без подкаталогов) рекурсивно и перемещает все найденные файлы в папку (папки), один уровень, как буквально спросили относительно в целях состоит в том, чтобы переместить файлы из самой низкой папки уровня, создать резервную копию одного каталога:
#!/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)
reorganize.py
Выполните его командой:
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)
Следующее переместит все .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
также.
Если все Ваши конечные файлы находятся в каталогах, названных photos
, Вы могли бы сделать что-то как:
find . -type d -name photos -exec bash -c 'cd {} && mv *jpg ../' \;
, Который будет искать названия каталогов photos
, затем запустите оболочку удара, которая будет cd
в каждого из них и перемещать весь .jpg
файлы к родительскому каталогу.
Будет находить самый низкий уровень в каждом ответвлении каталога и использовать его в качестве основы для Вашей находки и перемещать '*.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