Как я могу "инвертировать" структуру каталогов?

441
Alistair Knock

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

<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
Hafthor

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

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

В linux mkdir -p создает промежуточные каталоги. Abhinav 10 лет назад 0
В Windows mkdir создаст промежуточные каталоги, если у вас включена опция «Расширения команд», которые были установлены по умолчанию начиная с Windows NT. crb 10 лет назад 2
Ницца! Однако, предостережение - следите за конфликтами имен между папками и подпапками (например, "foo \ bar" и "bar \ baz"). Вы можете обойти это, изменив "` ~ ~ ny \% x` "на, например," C: \ target \% ~ ny \% x` "(и пропустите первую строку, как обсуждалось ранее). Ben Blank 10 лет назад 0
1
Alistair Knock

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 
Аааа, не пытайтесь быть умным после долгого рабочего дня и не запускайте сценарий создания папок в цикле for .. do, который перебирает каждую папку! :) Alistair Knock 10 лет назад 0
0
jtbandes

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

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

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

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