Como posso “inverter” uma estrutura de diretórios?

3

Eu uso uma ferramenta de processamento de imagens que pode enviar em lote diferentes tamanhos da mesma imagem para o formulário de diretório:

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

Gostaria de inverter isso rotineiramente e mover todos os arquivos da subpasta para o novo local, por exemplo:

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

Gostaria de executar a operação na pasta Superbowl . Existe uma ferramenta simples disponível que pode fazer isso, ou um script Windows .bat ou Linux bash?

    
por Alistair Knock 15.07.2009 / 10:06

3 respostas

2

Acho que algo assim deveria funcionar:

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"

As duas primeiras linhas criam o conjunto de diretórios invertido, o terceiro move tudo. Se você colocar isso em um arquivo de lote, precisará duplicar os caracteres%.

Tenho certeza que você não precisa da primeira linha, já que o MKDIR parece criar diretórios intermediários automaticamente, mas eu não sei desde há quanto tempo.

    
por 15.07.2009 / 10:11
1

As segundas e terceiras linhas de Hafthor perto o suficiente, mas eu queria ser capaz de especificar um diretório para modificá-las:

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"

Na verdade, fui um pouco além e desenvolvi o seguinte script - não me responsabilizo por qualquer estranheza / exclusão indesejada de arquivos que possam ocorrer; corra por sua conta e risco:

@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
    
por 22.07.2009 / 00:25
0

Não sei scripts em lote, mas esse provavelmente é o procedimento geral que você deseja usar:

  1. Crie uma pasta externa para cada pasta de tamanho.
  2. Mova cada pasta de tamanho para o diretório externo, renomeando-a para o nome de seu pai (o nome do diretório específico).

E, uh ... é isso, eu acho. Não é muito complexo por enquanto.

    
por 15.07.2009 / 10:10