Appiattire la struttura delle directory


15

Ho un sacco di cartelle all'interno di cartelle. Come questo

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

Voglio comprimere tutte le cartelle in modo che tutti i file nella cartella 1, cartella 2, cartella 3, ... cartella n esistano nella cartella principale.

Qual è il modo più veloce per farlo in Windows?


5
Dipende, come vorresti gestire nomi di file duplicati?
Mark Allen,

Risposte:


19

Non c'è motivo di usare strumenti speciali o persino script. Basta usare la funzione di ricerca in Explorer.

  1. Apri la cartella che desideri appiattire in Explorer.
  2. Crea una nuova cartella, seleziona tutti i file (ma non le cartelle) e trascinali in quella cartella (Ciò eviterà di ottenere due copie di quei file.)
  3. Nella casella di ricerca (quella a destra della barra degli indirizzi), digita *e premi Invio.
  4. Dopo che l'elenco viene popolato, fai clic con il pulsante destro del mouse e seleziona tutto, quindi fai clic con il pulsante destro del mouse e Taglia.
  5. Premi il pulsante Indietro per tornare alla cartella originale, quindi fai clic con il pulsante destro del mouse e incolla.
  6. Se hai nomi duplicati, ti verrà chiesto come gestirlo. Scegli l'opzione più appropriata per il tuo caso d'uso. (Suppongo che sarebbe copiare entrambi i file.) Per evitare di essere nuovamente richiesto, assicurati di applicarlo a tutti i file con la casella di controllo in basso.
  7. Seleziona tutte le cartelle, assicurati che siano vuote guardando il popup sul numero di file selezionati, quindi eliminali.

Se preferisci avere uno script in modo da poterlo avviare e dimenticarlo, puoi farlo anche tu. Il comando da sostituire mv *\* .è abbastanza semplice ( for /r %f in (*.*) do @move "%~f" .) ma sono sicuro che ti piacerebbe gestire i duplicati, senza lasciarli indietro come nella risposta di @Nicole Hamilton. Aggiungere un numero al nome file dei duplicati è probabilmente il modo più semplice per farlo.

Copia e incolla il seguente file batch nel Blocco note e salvalo come "flatten.cmd" (comprese le virgolette):

@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"

Per usare lo script, trascina semplicemente la cartella che desideri appiattire su di essa.


1
Simile ma più facile da capire: superuser.com/a/523854/433830
aparente001

Nota: questo script è essenzialmente una bomba a forcella. Lo sto usando in una cartella con migliaia di sottodirectory e decine di migliaia di file secondari e il footprint di memoria sta lentamente aumentando. Non penso che incontrerò problemi di OOM, ma è qualcosa da tenere a mente.
Nzall,

@Nzall Non ho problemi a credere che potesse farlo, ma darei la colpa a Microsoft, non al mio codice. Tutto quello che faccio è chiamare più volte una subroutine nel file batch. E non eseguo mai più di uno alla volta: ogni subroutine viene eseguita fino al completamento, eseguendo solo un processo alla volta. Di quanta memoria stiamo parlando di essere utilizzati?
sincero

@trlkly A un certo punto è arrivato a 2 GB, anche se avevo una quantità abbastanza grande di cartelle e sottocartelle, circa 75.000 file e migliaia di cartelle. Pochi istanti dopo è tornato a circa 8-900 MB. C'erano un sacco di file duplicati però. Stavo appiattendo 12 copie di una libreria Javascript di 7.500 file in modo da poter testare come un certo software avrebbe gestito una cartella con decine di migliaia di file.
Nzall,

@Nzall Questo è incredibilmente strano per me. Nulla della sceneggiatura dovrebbe farlo. È una subroutine che riutilizza una singola variabile per incrementare il file. Potrei dover chiedere cosa potrebbe causare un utilizzo così grande della memoria su SO o qualcosa del genere.
sincero

9

È possibile appiattire in Esplora risorse andando alla cartella che si desidera appiattire e cercando System.Kind:<>folderdi escludere le cartelle dai risultati.

È quindi possibile selezionare tutti i file con CTRL + A e copiarli e incollarli in una nuova cartella. Nota: Windows Explorer ti chiederà come gestire nomi di file duplicati.

inserisci qui la descrizione dell'immagine


1
si noti che per farlo funzionare è necessario digitare "cartella" nella traduzione localizzata corrispondente (ad esempio, in italiano è System.Kind:<>cartella )
JohnKiller

0

Questo tipo di cose è facile con una shell Unix. Ecco cosa potresti fare con la mia shell Hamilton C (inclusa la versione gratuita ). Potresti fare qualcosa di molto simile con Cygwin Bash.

mv *\* .

Se la tua directory è davvero enorme, è possibile che un jolly in una riga di comando troppo lungo possa passare a un processo figlio. (La chiamata di Windows CreateProcess limita l'elenco degli argomenti a 32K caratteri Unicode.) Ma la shell C non ha limiti internamente, quindi è possibile scorrere in questo modo l'intero elenco:

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

Al punto sopra @ MarkAllen, questo tipo di presuppone che non ci siano nomi duplicati. In tal caso, le copie successive dell'elenco sovrascriveranno quelle precedenti. Se questo è un problema, puoi scorrere i file,mv 'ing li solo se non stai sovrascrivendo. L' :toperatore è l' operatore di coda . L' -eoperatore è il file esiste test .

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

Questo lascia ancora le directory vuote, che forse non vuoi dopo che sono state svuotate. Potrebbe essere la prossima iterazione se contava.


Utilizzando cygwin> mv *. mv: impossibile stat `* ': nessun file o directory di questo tipo
Più di cinque

In Cygwin bash, mv */* .lavora per me.
Nicole Hamilton,

3
Alcune persone sono così fisse in UNIXism ... Se vuoi davvero fare script in Windows 7, c'è PowerShell, non hai bisogno di un simulatore bash falso come Cygwin.

Non hai nemmeno bisogno di PowerShell. La normale riga di comando esiste ancora e può fare le stesse cose. Vedi la mia risposta qui sotto.
sinceramente il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.