Wie kann ich eine Verzeichnisstruktur "invertieren"?

1465
Alistair Knock

Ich verwende ein Bildverarbeitungswerkzeug, mit dem verschiedene Größen desselben Bildes im Verzeichnisformular ausgegeben werden können:

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

Ich möchte dies routinemäßig invertieren und alle Dateien innerhalb des Unterordners an den neuen Speicherort verschieben, dh:

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

Ich würde mir vorstellen, die Operation gegen den SuperbowlOrdner auszuführen. Gibt es ein einfaches Werkzeug, das dies ermöglicht, oder ein Windows-.bat- oder Linux-Bash-Skript?

3

3 Antworten auf die Frage

2
Hafthor

Ich denke, so etwas sollte funktionieren:

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" 

In den ersten beiden Zeilen wird der invertierte Verzeichnissatz erstellt, in der dritten wird alles verschoben. Wenn Sie dies in eine Batchdatei schreiben, müssen Sie die% -Zeichen verdoppeln.

Ziemlich sicher, dass Sie die erste Zeile nicht benötigen, da MKDIR automatisch Zwischenverzeichnisse erstellt, aber ich weiß nicht, wie lange.

Unter Linux erstellt mkdir -p Zwischenverzeichnisse. Abhinav vor 14 Jahren 0
Unter Windows erstellt mkdir Zwischenverzeichnisse, wenn Sie "Befehlserweiterungen" aktiviert haben, die seit Windows NT standardmäßig verwendet wurden. crb vor 14 Jahren 2
Nice! A word of caution, though — watch out for name collisions between folders and subfolders (e.g. "foo\bar" and "bar\baz"). You can get around this by changing "`%~ny\%x`" to e.g. "`C:\target\%~ny\%x`" (and omit the first line as previously discussed). Ben Blank vor 14 Jahren 0
1
Alistair Knock

Hafthors zweite und dritte Zeile sind nahe genug, aber ich wollte in der Lage sein, ein Verzeichnis anzugeben, in dem sie so geändert wurden:

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" 

Eigentlich bin ich ein gutes Stück weitergegangen und habe das folgende Skript entwickelt - ich übernehme keinerlei Verantwortung für jegliche Verrückung / unerwünschte Löschung von Dateien, die auftreten können; Laufen auf eigenes Risiko:

@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 
Versuchen Sie nicht, nach einem langen Arbeitstag klug zu sein, und führen Sie ein Skript zum Erstellen eines Ordners in einer for .. do-Schleife aus, die jeden Ordner durchläuft! :) Alistair Knock vor 14 Jahren 0
0
jtbandes

Ich kenne kein Batch-Scripting, aber dies ist wahrscheinlich das allgemeine Verfahren, das Sie verwenden möchten:

  1. Erstellen Sie einen externen Ordner für jeden Größenordner.
  2. Verschieben Sie jeden Größenordner in das externe Verzeichnis und benennen Sie ihn in den Namen des übergeordneten Elements (den spezifischen Verzeichnisnamen) um.

Und das ist es, denke ich. Im Moment nicht zu komplex.