пакетное перемещение всех файлов в 100s папок в одну папку
У меня небольшая проблема. Я не очень хорошо разбираюсь в пакетных сценариях, но я пытаюсь стать лучше. Я пытаюсь заставить скрипт работать на моей текущей работе, который мы можем использовать для перемещения всех файлов в последнем подкаталоге родительского каталога в один каталог.
потребность для moving последовательностей изображения поставленных с излишним sub-directory вверх по одному sub-directory для потока операций влияний
по существу, мне доставляют 100 последовательностей изображений as:
эпизод / кадры / выстрел / разрешение / выстрел.0000001.dpx
Я хотел бы пакетный скрипт, который я мог бы переместить в папку" кадры", которая будет анализировать каталоги снимков под ними и перемещать последовательности изображений из папки разрешения и помещать их непосредственно в папку снимков, чтобы структура выглядела более так:
эпизод / кадры / выстрел / выстрел.0000001.dpx
этот пакет необходимо будет повторно использовать во многих случаях и просто быть надежным достаточно для повторного использования независимо от того, какие расширения в последовательностях изображений или структура именования вложенных папок.
3 ответов
for /f "delims==" %%i in ('dir /a:d /b') do for /f "delims==" %%f in ('dir "%%i" /a:d /b') do (move "%%i\%%f\*" "%%i"&&rd "%%i\%%f" /s /q)
* Можно заменить на * . * (без пробелов) только для захвата файлов.
Использовать % вместо %% для использования в командной строке.
Это будет захватить от любой реж под пленку. Удалите первый цикл for и замените все появления %%i выстрелом, чтобы только захватить оттуда.
#!/bin/bash
mv Episode/Footage/Shot/*/* Episode/Footage/Shot
или для большей причудливости:
#!/bin/bash
echo "Write the file path:"
read file_path
mv $file_path/*/* $file_path/
это спросит вас, что такое путь (это эпизоды / кадры/выстрел в вашем примере), затем найдите все файлы в этом пути и все файлы внутри них и поместите их все в путь. Вы также можете изменить это, если вместо того, чтобы помещать файлы в путь, который вы хотите, чтобы они были в другом месте, вы можете добавить:
echo "Write the destination file path:"
read file_path2
между ними: прочитайте file_path и mv ... и перемена:
mv $file_path/*/* $file_path
в:
mv $file_path/*/* $file_path2
на самом деле нет необходимости проходить через столько проблем.
За исключением команд PUSHD и POPD, все это можно поместить на одну строку, как это сделал nephi12.
я ставлю все на отдельные строки ради ясновидения, но приведу два примера этого на одной строке позже.
REM Set working directory
PUSHD C:\Episode\Footage\
REM Find all the sub directories of the working
REM directory, and if any exist execute the loop below:
For /d %%d in ( *.* ) do (
REM Move all files inside the subdirectory up one level.
move /s %%d\*.* %%d\..\.
REM Delete the directories if they are empty.
RD /y %%d
)
REM Return to your original working directory.
POPD
приведенный выше код помещает текущее имя каталога в стек и изменяет dirs на Footage.
Тогда For /d
команда захватывает все (если есть) подкаталоги видеоматериалов и подает их по одному сначала в MOVE
команда, затем в команду удалить каталог.
на MOVE /s
команда перемещает все файлы в каталоге %%d (включая любые в подпапках) на один уровень выше.
Далее RD /y
команда автоматически удаляет теперь пустые каталоги или вызывает мягкую ошибку, если они не пусты.
последняя команда возвращает рабочий каталог в Исходное расположение, POP
ing путь от стека.
на одной линии, без PUSHD
и POPD
команды и очистка каталога, это выглядит так:
Однострочное Решение:
For /d %%d in ( *.* ) do move /s %%d\*.* %%d\..\.
однострочное решение с очисткой:
чтобы включить очистку, просто "добавьте" команду и &&
после и до RD
, как Итак:
For /d %%d in ( *.* ) do ( move /s %%d\*.* %%d\..\. & RD /y %%d )
почему я сделал то, что сделал.
самый быстрый способ переместить целую кучу файлов, это не сказать move
как и куда переместить каждый файл, но использовать wild-карты, которые позволят Move
чтобы выяснить сам, где их поставить. Поэтому вместо того, чтобы говорить ему перемещать один файл за раз, я даю ему wild cards, что позволяетMOVE
работать на нем быстрее всего. Поэтому я только кормлю его отдельными исходными и целевыми каталогами и говорю "скопируйте все файлы отсюда туда".
набор скобки (...)
может содержать то, что интерпретатор считает одной строкой кода. Что вызывает целый новый набор проблем, но позволяет специальной переменной, такой как %%d, существовать на (что нам кажется) нескольких строках кода. Я сделал это наверху. Позже я использовал другой набор скобок, чтобы показать интерпретатору команд, что часть одной строки находится внутри FOR
заявление, а чего нет.
я тоже раньше немного старой DOS стенографии, чтобы указать родительский каталог,..
что позволяет мне не знать точный путь чего-то, и все еще манипулировать вещами в его родителе. Например,C:\WINDOWS\..
is C:\
и C:\WINDOWS\SYSTEM32\..
is C:\WINDOWS\
.
вы можете заметить, что я также использовал спецификацию файла .
. Это, вероятно, не нужно, но я столкнулся с достаточно неприятностей без него, что я использую его. Это просто дает понять MOVE
что мы перемещаем эти файлы в папку, а не файл. И, О да,MOVE
будет с удовольствием перемещать сотни ваших файлов друг на друга, разрушая их все, кроме последнего. Вы можете себе представить, как я пришел, чтобы обнять .
.
на &
позволяет вводить несколько команд или программ в одну строку кода и позволяет мне привязать RD к концу строки и по-прежнему иметь доступ к специальным переменным, которые создать.
Итак, теперь, если бы вы обращали внимание, вы бы понял, что мое второе предложение было ложью. Ничто не мешает вам лавировать!--29--> и & POPD
на начало и конец этой строки.