Script della shell per spostare tutti i file dalle sottocartelle alla cartella principale


50

Ho un sacco di cartelle nella cartella A. Voglio spostare i file da tutte quelle cartelle in A.

O

Voglio tagliare tutti i file dalle cartelle secondarie e incollarli nella cartella principale.

Come farlo?


1
Non ho davvero testato questo per essere infallibile o altro, ma hai provato semplicemente inserendo questo comando dalla cartella A in un terminale mv */* .:?
Marty Fried,

Sei sicuro che non ci siano nomi di file duplicati?
jippie,

mv */* .non sposta i file dalla sottocartella delle sottocartelle.
Rahul Virpara,

@jippie sì, non ci sono nomi duplicati
Rahul Virpara,

Risposte:


83

Vai alla tua Adirectory ed esegui

find . -mindepth 2 -type f -print -exec mv {} . \;

il che significa "trova tutti i file in questa directory e nelle sue sottodirectory ed esegui mv con la directory di destinazione. per ogni file trovato per spostarli nella directory corrente.


1
prova anche a spostare i file che sono già nella directory principale.
Rahul Virpara,

virpara: ora questa tua edizione dimentica tutti i file nelle directory .dot. È stato quindi modificato con -mindepth 2 per eliminare gli avvisi.
Tuminoid,

1
Con GNU findpuoi essere un po 'più elegante e non generare un mvprocesso per ogni file:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster,

David, la tua versione funziona fino a quando non raggiungi il limite massimo di lunghezza della riga di comando, il che non è così difficile da fare dato che find stampa i percorsi, specialmente nel caso in cui lo invochi da una directory diversa da A, come nel tuo esempio.
Tuminoide,

9
Questo è molto pericoloso. se hai file con lo stesso nome in diverse sottocartelle, li sovrascriverai con l'ultima ricerca. Meglio usare mv con --backup = numerato:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo

4

Bene, potresti creare un file e chiamarlo "cutme" (per creare un file chiamato cutme nel tipo di terminale nano cutme. Per salvarlo premi CTRL + X quindi premi INVIO.) Per esempio e incolla quanto segue presupponendo che:

  1. Vuoi farlo in modo ricorsivo (nelle sottocartelle e nelle sottocartelle di quelle sottocartelle)
  2. Vuoi saltare lo spostamento del file di script
  3. Hai i permessi per spostare i file in quella cartella
  4. I file possono o meno includere spazi nei loro nomi

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Nota il nome cutme all'interno della riga. Dovrebbe essere uguale allo script che eseguirai.

Dopo aver creato il file e incollato la riga sopra, esegui quanto segue nella stessa cartella dello script:

chmod +x cutme. Questo darà al vostro nuovo file il flag "eseguibile" in modo da poter eseguire in questo modo: ./cutme.


Perché dovrei provare a spostare i file che sono già nella directory principale?
Rahul Virpara,

Dovresti eseguire lo script dall'interno della cartella. Ogni file in essa contenuto, se all'interno di una sottocartella o meno, verrebbe spostato nella cartella principale della cartella. La cartella principale qui è la parent in relazione a dove si trova lo script. In realtà cambiando gli ultimi 2 punti puoi dire dove spostare tutti i file all'interno di una cartella in cui esegui lo script.
Luis Alvarado,
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.