Verzeichnisstruktur reduzieren


15

Ich habe eine Reihe von Ordnern in Ordnern. So was

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

Ich möchte alle Ordner minimieren, sodass alle Dateien unter Ordner1, Ordner 2, Ordner 3, ... Ordner n unter Stammordner vorhanden sind.

Was ist der schnellste Weg, um dies in Windows zu tun?


5
Es kommt darauf an, wie mit doppelten Dateinamen umgegangen werden soll.
Mark Allen

Antworten:


19

Es gibt keinen Grund, spezielle Tools oder gar Skripte zu verwenden. Verwenden Sie einfach die Suchfunktion im Explorer.

  1. Öffnen Sie den Ordner, den Sie reduzieren möchten, im Explorer.
  2. Erstellen Sie einen neuen Ordner, wählen Sie alle Dateien (jedoch keine Ordner) aus und ziehen Sie sie in diesen Ordner.
  3. *Geben Sie im Suchfeld (das auf der rechten Seite der Adressleiste) ein und drücken Sie die Eingabetaste.
  4. Klicken Sie nach dem Auffüllen der Liste mit der rechten Maustaste und wählen Sie alle aus. Klicken Sie dann mit der rechten Maustaste und wählen Sie Ausschneiden.
  5. Drücken Sie die Zurück-Taste, um zum ursprünglichen Ordner zurückzukehren. Klicken Sie dann mit der rechten Maustaste und fügen Sie ihn ein.
  6. Wenn Sie doppelte Namen haben, werden Sie gefragt, wie Sie damit umgehen sollen. Wählen Sie die für Ihren Anwendungsfall am besten geeignete Option. (Ich gehe davon aus, dass beide Dateien kopiert werden müssen.) Um eine erneute Aufforderung zu vermeiden, sollten Sie dies auf alle Dateien mit dem Kontrollkästchen unten anwenden.
  7. Wählen Sie alle Ordner aus, vergewissern Sie sich, dass sie leer sind, indem Sie sich das Popup mit der Anzahl der ausgewählten Dateien ansehen und diese anschließend löschen.

Wenn Sie lieber ein Skript haben, um es einfach zu starten und zu vergessen, können Sie dies auch tun. Der Befehl zum Ersetzen mv *\* .ist ziemlich einfach ( for /r %f in (*.*) do @move "%~f" .), aber ich bin sicher, Sie möchten mit Duplikaten umgehen, ohne sie wie in der Antwort von @Nicole Hamilton zurückzulassen. Das Anhängen einer Zahl an den Dateinamen von Duplikaten ist wahrscheinlich der einfachste Weg, dies zu tun.

Kopieren Sie die folgende Batchdatei, fügen Sie sie in den Editor ein und speichern Sie sie unter dem Namen "flatten.cmd" (einschließlich der Anführungszeichen):

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

Um das Skript zu verwenden, ziehen Sie einfach den Ordner, den Sie reduzieren möchten, darauf.


1
Ähnlich , aber leichter zu verstehen: superuser.com/a/523854/433830
aparente001

Hinweis: Dieses Skript ist im Wesentlichen eine Gabelbombe. Ich verwende es in einem Ordner mit Tausenden von Unterverzeichnissen und Zehntausenden von Unterdateien, und der Speicherbedarf nimmt langsam zu. Ich glaube nicht, dass ich auf OOM-Probleme stoßen werde, aber es ist etwas, das man sich merken sollte.
Nzall

@Nzall Ich habe kein Problem damit zu glauben, dass es das kann, aber ich würde Microsoft die Schuld geben, nicht meinen Code. Ich rufe lediglich mehrmals ein Unterprogramm in der Batch-Datei auf. Und ich führe nie mehr als eine Subroutine gleichzeitig aus: Jede Subroutine wird bis zum Abschluss ausgeführt, wobei jeweils nur ein Prozess ausgeführt wird. Von wie viel Speicher sprechen wir, wenn wir benutzt werden?
Trlkly

@trlkly Irgendwann waren es bis zu 2 GB, obwohl ich ziemlich viele Ordner und Unterordner hatte, ungefähr 75.000 Dateien und Tausende von Ordnern. Ein paar Momente später fiel es wieder auf ca. 8-900 MB. Es gab jedoch viele doppelte Dateien. Ich habe 12 Kopien einer 7.500-fachen Javascript-Bibliothek reduziert, um zu testen, wie bestimmte Software einen Ordner mit Zehntausenden von Dateien handhabt.
Nzall

@Nzall Das ist unglaublich komisch für mich. Das Skript sollte das nicht tun. Es ist eine Subroutine, die eine einzelne Variable wiederverwendet, um die Datei zu erhöhen. Möglicherweise muss ich fragen, was eine so große Speichernutzung auf SO oder so etwas verursachen könnte.
Trlkly

9

Sie können in Windows Explorer eine Reduzierung durchführen, indem Sie zu dem Ordner navigieren, den Sie reduzieren möchten, und nach dem Sie suchen System.Kind:<>folder, um Ordner von den Ergebnissen auszuschließen.

Sie können dann alle Dateien mit STRG + A auswählen und kopieren und in einen neuen Ordner einfügen. Beachten Sie, dass Sie vom Windows Explorer gefragt werden, wie mit doppelten Dateinamen umgegangen werden soll.

Bildbeschreibung hier eingeben


1
Beachten Sie, dass Sie "Ordner" in die entsprechende lokalisierte Übersetzung System.Kind:<>cartella
eingeben müssen

0

Mit einer Unix-Shell ist das ganz einfach. Hier ist, was Sie mit meiner eigenen Hamilton C-Shell (einschließlich der kostenlosen Version ) tun können. Mit Cygwin- Bash können Sie etwas sehr Ähnliches tun .

mv *\* .

Wenn Ihr Verzeichnis wirklich riesig ist, kann ein Platzhalter in einer zu langen Befehlszeile vorkommen, damit Windows ihn an einen untergeordneten Prozess weitergibt. (Der Windows CreateProcess- Aufruf beschränkt die Argumentliste auf 32 KB Unicode-Zeichen.) Die C-Shell hat jedoch intern keine Begrenzung, sodass Sie die gesamte Liste folgendermaßen durchlaufen können:

foreach i ( *\* )
   mv $i .
end

Nach dem obigen Punkt von @ MarkAllen wird davon ausgegangen, dass es keine doppelten Namen gibt. In diesem Fall werden die älteren Exemplare durch die späteren Exemplare in der Liste überschrieben. Wenn Sie Bedenken haben, können Sie die Dateien mvdurchlaufen und nur dann bearbeiten, wenn Sie sie nicht überschreiben. Der :tOperator ist der Heckoperator . Der -eOperator ist die Datei existiert Test .

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

Dadurch bleiben immer noch leere Verzeichnisse übrig, die Sie nach dem Leeren möglicherweise nicht mehr benötigen. Das könnte die nächste Iteration sein, wenn es darauf ankommt.


Mit cygwin> mv *. mv: kann nicht angeben "* ": Keine solche Datei oder kein solches Verzeichnis
Mehr als fünf

In Cygwin bash, mv */* .arbeitet für mich.
Nicole Hamilton

3
Einige Leute sind so fix in UNIXism ... Wenn Sie wirklich Skripte in Windows 7 ausführen möchten, gibt es PowerShell, und Sie brauchen keinen falschen Bash-Simulator wie Cygwin.

Sie brauchen nicht einmal PowerShell. Die reguläre Befehlszeile ist weiterhin vorhanden und kann die gleichen Aktionen ausführen. Siehe meine Antwort unten.
Trlkly
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.