3

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

<specific directory>\<image size name>
e.g. SuperBowl\Fullsize JPEG

Я хотел бы регулярно инвертировать это и переместить любые файлы в подпапке в новое место, то есть:

<image size name>\<specific directory>
e.g. Fullsize JPEG\SuperBowl

Я хотел бы предусмотреть запуск операции с папкой Superbowl . Есть ли простой инструмент, который может сделать это, или Windows .bat или Linux bash скрипт?

3 ответа3

2

Я думаю, что-то вроде этого должно работать:

for /d %x in (*) do for /d %y in ("%x\*") do md "%~ny"
for /d %x in (*) do for /d %y in ("%x\*") do md "%~ny\%x"
for /d %x in (*) do for /d %y in ("%x\*") do move "%x\%~ny\*" "%~ny\%x"

Первые две строки создают инвертированный набор каталогов, третья перемещает все. Если вы поместите это в пакетный файл, вам нужно удвоить символы%.

Я уверен, что вам не нужна первая строка, так как MKDIR, кажется, автоматически создает промежуточные каталоги, но я не буду с тех пор, как долго.

1

2-я и 3-я строки Hafthor достаточно близки, но я хотел иметь возможность указать каталог, поэтому изменил их так:

for /d %%x in ("%1") do for /d %%y in ("%%x\*") do md "%%~ny\%%x"
for /d %%x in ("%1") do for /d %%y in ("%%x\*") do move "%%x\%%~ny\*" "%%~ny\%%x"

На самом деле, я пошел дальше и разработал следующий сценарий - я не несу никакой ответственности за любые странные / нежелательные удаления файлов, которые могут произойти; бежать на свой страх и риск:

@echo off
if [%1]==[] goto noparameter
if "%1"=="*" goto nowildcards
if "%1"=="/?" goto help
if not exist %1 (
  echo The directory does not exist.
  goto exit
)

echo.
echo Creating new directories...
for /d %%x in ("%1") do for /d %%y in ("%%x\*") do md "%%~ny\%%x"
echo.
echo Moving files...
for /d %%x in ("%1") do for /d %%y in ("%%x\*") do move "%%x\%%~ny\*" "%%~ny\%%x"
echo.
echo Files were flipped for directory %1; this directory now contains (should be empty):
dir %1 /S /B
echo.
echo =======================================================================
echo The previous (sure it's empty?) directory structure will now be deleted
echo.

if "%2"=="/F" (
  echo Deletion forced
  rmdir %1 /S /Q
) else (
  rmdir %1 /S
)

goto exit

:noparameter
echo You must specify a directory to flip.
goto exit

:nowildcards
echo You cannot use a wildcard (asterisk) with this script.
goto exit

:help
echo Takes directory structure a/b and converts it to b/a, moving any files within.
echo Works only with a single directory when you are within its parent.
echo.
echo FLIP [directory] [/F]
echo.
echo.  /F  Force deletion of directory structure without prompt
goto exit

:exit
0

Я не знаю пакетных сценариев, но это, вероятно, общая процедура, которую вы хотели бы использовать:

  1. Создайте внешнюю папку для каждой папки размера.
  2. Переместите папку каждого размера во внешний каталог, переименовав его в имя его родителя (конкретное имя каталога).

И, эээ ... вот и все, наверное. Пока не слишком сложно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .