Come posso appiattire una cartella in Windows 7, supponendo che tutti i nomi dei file siano diversi?


19

Ad esempio, supponiamo che io abbia la seguente gerarchia di cartelle:

Folder1
   File1
   Folder2
      File2
   Folder3
      File3
      Folder4
         File4

Voglio eseguire alcuni comandi che si traducono in:

Folder1
   File1
   File2
   File3
   File4

o qualcosa di simile. Non ho molta familiarità con Windows, quindi apprezzerei quanti più dettagli possibili nella risposta.


Stai cercando un programma esistente per fare questo per te, o un pezzo di codice (quale linguaggio di programmazione) che lo fa?
Matt Ball,

@MattBall: sto cercando il modo più semplice possibile per farlo. Idealmente, ciò significherebbe aprire un terminale e immettere un comando. Ancora una volta, non ho molta esperienza con Windows, quindi per favore fatemi sapere se esiste un modo migliore. Grazie.

Risposte:


32

Il modo più semplice in assoluto è quello di accedere alla cartella principale comune ed effettuare una ricerca di tutti i file (ad es. Cercare *). Quando vengono trovati tutti i file, selezionare tutti i file, premere Ctrl + X e accedere nuovamente alla cartella principale comune. Ora premi Ctrl + V per incollare tutti i file nella cartella principale. Al termine, eliminare tutte le sottodirectory.

Non so se questo può essere fatto come un processo batch.


1
Mi piace la semplicità di questo, ma l'ho provato con file 40k e ha bloccato il processo di esplorazione.
UpTheCreek

La risposta del comandante totale mi sembra più facile.
Ev0oD

13

Ho usato questo approccio PowerShell alla fine quando avevo bisogno di appiattire una grande struttura gerarchica (nel mio caso pngs):

Get-ChildItem C:\sourcefolder -Recurse -Filter "*.png" | Copy-Item -destination C:\destinationfolder\

Per l'appiattimento forse Move-Item è più adatto?
geisterfurz007 Ferma questo caos il

4

windows exe: http://en.sourceforge.jp/projects/sfnet_flatfolder/

o AHK:

fileselectfolder,MyFold,::{20d04fe0-3aea-1069-a2d8-08002b30309d}
SetWorkingDir, %MyFold%
loop, *.*,0,1
{
  parentpath := RegExReplace(A_LoopFileDir,"\\","-")
  ;StringReplace, parentpath, A_LoopFileDir, \,-,All
  newname = %parentpath%-%A_LoopFileName%
  ;msgbox %newname%
  If a_loopfiledir <>
    filemove, %a_loopfilefullpath%,%newname%
}

loop, %myfold%\*.*,2,1
  fileremovedir, %a_loopfilefullpath%,1

exitapp

o usa Directory Opus

o Powershell

(ls -r -include *.jpg) | % { mv -literal $_ $_.Name.Insert(0, [String]::Format("{0} - ", $_.Directory.Name))}

o batch (come menzionato sopra)

o la ricerca manuale, taglia e incolla come indicato sopra

Ci sono molti modi, a seconda delle tue abilità e inclinazioni, puoi scegliere uno di questi e perfezionare in base alle tue esigenze.

Potrebbe essere necessario rimuovere questa directory vuota dopo l'operazione sopra


1
Il comando PowerShell è breve e funziona bene
Maxim Yefremov,

3

Se hai solo bisogno di appiattire la directory manualmente di volta in volta, Total Commander è perfetto.

In Total Commander: vai alla tua directory che vuoi appiattire. Nel menu fai clic su Comandi> Vista diramazione . E vedi tutto appiattito, puoi spostarlo / copiarlo in un'altra cartella.

Se devi armeggiare un po 'con i nomi dei file: seleziona tutti i file in vista piatta, nel menu vai su File> Strumento multi-rinomina . Qui puoi aggiungere alcune informazioni dal percorso ai nomi dei file effettivi usando "Rinomina maschera", devi solo usare il tag / pulsante del plugin lì, cercare e sostituire la funzione e il piccolo pulsante di supporto, che ti consente di apportare alcune ultime modifiche ai nomi dei file in editor di testo. Può sembrare complicato, ma davvero il modo più semplice IMO :)


Che cos'è Windows Commander? Intendi Total Commander?
UpTheCreek

Esatto :) Lo usavo da 10 anni, allora il nome era Windows Commander. Redatto
martedì

Grazie. L'ho appena provato. Non funzionerebbe per file piccoli 40k :( ha consumato molta CPU per 10 minuti, poi è venuto fuori con ripetuti errori "
Impossibile

L'uso della CPU e la lentezza implicita sono sfortunati ma comprensibili :) L'errore è qualcos'altro .. potrebbe essere una cattiva denominazione, un bug del comandante totale o l'incapacità di TC di gestire così tanti file. Vorrei provare a rinominare prima un numero inferiore di file o utilizzare la versione più recente di TC
teejay

@teejay, ho dovuto cercare i dettagli del tuo suggerimento, ma alla fine sono riuscito a realizzarlo. Ho usato il plugin expander2 per estrarre parti del percorso e renderle il prefisso del nome del file. Potresti voler aggiungere alcuni dettagli per il prossimo ragazzo. Tx.
Killogre,

3

Abbastanza semplice con un'opzione da riga di comando per quelli non super tecnicamente propensi.

  1. Crea un file da qualche parte chiamato "flatten.cmd"
  2. Apri quel file nel Blocco note
  3. Nel file, inserire quanto segue:

    FOR /R {SourcePath} %%G IN (*.mp3) DO move "%%G" {Destination}
    
  4. Sostituisci "{SourcePath}" con la cartella che desideri appiattire. Nel tuo caso "c: \ Folder1"

  5. Sostituisci "{Destinazione"} con la cartella in cui desideri spostare i file. Nel tuo caso anche "c: \ Folder1". Il codice dovrebbe ora apparire come:

    FOR /R c:\Folder1 %%G IN (*.mp3) DO move "%%G" c:\Folder1
    
  6. Apri una finestra della riga di comando. Puoi farlo in diversi modi, ma questo è veloce:

    • Fai clic sul pulsante Start
    • Fai clic su Tutti i programmi
    • Fai clic su Accessori
    • Fai clic su Prompt dei comandi
  7. Nella finestra della riga di comando, digitare:

    cd {folder where you put the flatten.cmd file}
    flatten
    

E questo lo farà (Windows 8+) L'ho appena fatto per appiattire una cartella di 10.000 file musicali. Funziona come un fascino.

È possibile trovare le opzioni per l'utilità della riga di comando FOR in https://technet.microsoft.com/en-us/library/bb490909.aspx .


1

usando uno script batch (dalla parte superiore della mia testa):

Cerca il comando FOR

La prima riga sposta tutti i file dalle sottodirectory alla radice. La seconda elimina le sottocartelle

for /f %f in ('dir "c:\folder\*" /s/b/a-d') do if not %~ff"=="c:\folder" move "%f" "c:\folder"
for /f %f in ('dir "c:\folder\*" /s/b/ad') do if not "%~ff"=="c:\folder" rd /s/q "%f" 

quindi devo aprire un terminale e inserire questi comandi, assicurandomi di sostituire 'cartella' con il percorso appropriato? Grazie.

Se non vuoi scriverlo in uno script, sì. OTOH .....
Preet Sangha,

Questo può essere generalizzato e associato a un'azione del menu di scelta rapida? Mi piacerebbe poter fare clic con il pulsante destro del mouse su un file, fare clic su "Appiattisci file", quindi spostare tutti i file al suo interno fino al livello della cartella. Anche cancellare la cartella dopo sarebbe bello.
MAW74656,

sì, può inserirlo in un file batch con% 1 come nome della cartella. stackoverflow.com/questions/6162415/…
Preet Sangha

-Probabilmente puoi aiutare con questo superutente.com/q/552768/59747
MAW74656

1

Ciao, puoi anche usare lo strumento xxcopy (www.xxcopy.com), il suo xcopy su steriodi (una specie di). Con questo strumento puoi "appiattire" i file nelle cartelle in una cartella.

c:> xxcopy / sorgenti-cartelle / appiattire / SG

Basta leggere questo link: http://www.xxcopy.com/xxcopy16.htm

Saluti.

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.