3 votos

¿Cómo puedo yo "invertir" una estructura de directorios?

Utilizar una herramienta que puede lotes diferentes tamaños de salida de la misma imagen en el formulario del directorio de procesamiento de imágenes:

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

Me gustaría invertir esto rutinariamente y mueva todos los archivos dentro de la subcarpeta a la nueva ubicación, es decir:

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

Se prevé la ejecución de la operación contra la Superbowl carpeta. ¿Es una simple herramienta disponible que puede hacer esto, o un .bat de Windows o Linux bash script?

2voto

JimDaniel Puntos 4853

Creo que algo como esto debería 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"

Las dos primeras líneas crean el conjunto de directorio invertida, el tercero mueve todo. Si pones esto en un archivo por lotes, deberá duplicar los caracteres %.

Bastante seguro que no necesitas la primera línea parece MKDIR para crear directorios intermedios automáticamente, pero no pues como mucho.

1voto

Jason Weathered Puntos 690

Líneas de 2ª y 3ª de Hafthor cerca bastante el truco, pero yo quería ser capaz de especificar un directorio para ser modifican así:

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"

En realidad, fui un poco más y desarrollar la siguiente secuencia de comandos - no tomar ninguna responsabilidad alguna por cualquier rareza / no deseados borrado de archivos que puede ocurrir; ejecutar a su propio riesgo:

@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

0voto

Ryan Fox Puntos 5181

No sé de secuencias de comandos por lotes, pero esto es probablemente el procedimiento general que desea utilizar:

  1. Crear una carpeta externa para cada carpeta.
  2. Mueva cada carpeta en el directorio externo, cambiar el nombre al nombre de su padre (el nombre de directorio específico).

Y, uh... eso es todo, supongo. No es demasiado complejo por ahora.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: