пакетное перемещение всех файлов в 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 команда автоматически удаляет теперь пустые каталоги или вызывает мягкую ошибку, если они не пусты.

последняя команда возвращает рабочий каталог в Исходное расположение, POPing путь от стека.


на одной линии, без 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 на начало и конец этой строки.