Come faccio a spostare i file dalle sottodirectory nidificate in un'altra cartella in Ubuntu? (Cercando di rimuovere molte sottocartelle)


36

Come posso spostare file e non directory in un'altra cartella / cartella principale?

Ho una struttura di cartelle estremamente brutta, con alcuni file .mp3 sepolti 6 livelli in profondità in una sottocartella.

Voglio finire con tutti i file (principalmente .mp3 ma non tutti) in una directory, senza alcuna sottodirectory, usando Ubuntu.

Aiuto?

Risposte:


48

C'è una grande risposta in askubuntu-QA .

Per fare ciò, Apri un terminale ed esegui questo comando:

mv  -v ~/Downloads/* ~/Videos/

Sposterà tutti i file e le cartelle dalla cartella Download alla cartella Video.


Per spostare tutti i file, ma non le cartelle:

Ma, se sei interessato a spostare tutti i file (ma non le cartelle) dalla cartella Download alla cartella Video, usa questo comando

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

Per spostare solo i file dalle cartelle Download, ma non dalle sottocartelle:

Se si desidera spostare tutti i file dalla cartella Download, ma non tutti i file all'interno delle cartelle nella cartella Download, utilizzare questo comando:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

qui, l' -maxdepthopzione specifica il modo in cui provare a trovare in profondità, 1significa solo la directory specificata nel comando find. Puoi provare a usare 2, 3anche per testare.

Vedi la manpage di Ubuntu per una spiegazione dettagliata.

fonte


Se quello che voglio fare è copiare tutti i file nella cartella, dovrò cambiare mv in cp? Sono nuovo di Linux
Neoryder

13

Soluzione

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

Il comando troverà tutti i file regolari in /src/dir(incluse tutte le sottodirectory) e li sposterà in /dst/dirusando il comando mv. Sostituisci le directory con le tue. I file con gli stessi nomi verranno rinominati automaticamente.

Selezione dei file da spostare

Se si desidera spostare solo i file MP3, aggiungere l' -iname "*.mp3"opzione al findcomando dopo -type f.

Confronto con la risposta di c0dev

Solo il secondo comando nella risposta di c0dev risponde alla domanda. Di seguito è come si confronta con questa risposta. I punti 3. e 4. possono essere risolti nell'altra risposta nello stesso modo di qui.

  1. Tranne che per mvla soluzione con -exec +non è necessario chiamare un comando aggiuntivo come xargso parallele consegnare i nomi dei file due volte.
  2. L'altra risposta sovrascriverà silenziosamente i file con lo stesso nome. Qui i file verranno automaticamente rinominati grazie all'opzione --backup=numbered. Sfortunatamente questi backup con suffisso come ~3~saranno nascosti nella maggior parte dei file gestiti per impostazione predefinita. Sfortunatamente mvnon consente la modifica del suffisso, ma potrebbe essere facilmente post-elaborato da comandi aggiuntivi. Questa è un'estensione GNU.
  3. Al contrario, -print0 -exec command {} +fa parte degli standard IEEE Std 1003.1 (POSIX), ISO / IEC 9945 e The Single UNIX Specification. Quindi dovrebbe essere più portatile. Vedi IEEE Std 1003.1, 2004 Edition , IEEE Std 1003.1, 2013 Edition e 0000243: Aggiungi -print0 a "trova" . Ma comunque il -tpassaggio richiesto mvè un'estensione GNU, quindi l'intero comando non è portatile tra i sistemi POSIX.

Nota: Nel caso findsarebbe in grado di produrre i percorsi che iniziano con -(non so di tale attuazione findal momento.) La {}deve essere preceduta da l'indicatore di fine opzioni: --.


Errore: trova: argomento mancante per `-exec '
Chris

@ Chris: Hai ragione, sembra che {}debba essere l'ultimo argomento. Corretto.
pabouk,

@ Chris: Funziona ora come volevi? Se sì, probabilmente puoi accettare la risposta in modo che la tua domanda non venga visualizzata come "non risolta".
pabouk,

Questo è quello che sto eseguendo e ricevendo errori di directory non trovata:
Chris,

quello che sto eseguendo: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero pdf manager Desktop mozilla.pdf Immagini Documenti genitore Video clstal @ clap: ~ $ find / source / directory -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': nessun file o directory del genere
Chris

2

Sfortunatamente, non ho una reputazione abbastanza alta da commentare la soluzione contrassegnata. Tuttavia, volevo mettere in guardia gli altri su un problema che ho riscontrato. È abbastanza dilettante; tuttavia, quando stai facendo diverse cose, all'inizio potrebbe non venire in mente. Spero che possa aiutare gli altri.

Problema

Sono state fornite varianti del seguente messaggio dopo aver avviato il comando. Il comando crea quindi più file.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Causa

Il /srcè un genitore del /dst(per esempio /src/../dst/).

Soluzione

Anche se potrebbe esserci una soluzione migliore, ho semplicemente spostato i file in una directory temporanea al di fuori della mia /srce quindi ho eseguito nuovamente il comando per rimetterli nella /src/../dstdirectory in cui volevo che finissero.


2

Il mio one-liner: funziona su Mac ma dovrebbe funzionare anche su qualsiasi * nix. Inizia dalla directory principale.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

La prima parte sposta tutto da tutte le sottocartelle nella cartella effettiva da cui si avvia il comando; la seconda parte controlla se i sottocartelle sono vuoti (dovrebbero ora :-) e li elimina in modo da ottenere tutto qui senza sottocartelle.


(1) Spiega che cosa fa la tua risposta e quali vantaggi ha rispetto alle altre risposte (che sono molto simili). Si prega di non rispondere nei commenti; modifica la  tua risposta per renderla più chiara e completa. (2) Nota che l' -notoperatore non è standard, quindi il tuo comando è meno portabile degli altri.
Scott,

trova . -non -tipo d -print0 | xargs -0J% mv -f%. ; trova . -type d -depth -print0 | xargs -0 rm -rf Ho eseguito questo comando in una cartella ed ha eliminato le sottocartelle, la cartella in cui mi trovavo, e poi sono passato alla cartella principale. Fortunatamente stavo guardando il mio file manager e sono riuscito a interrompere il comando ed è stato eseguito in una cartella di prova.
Sarà il

1

Apri il terminale, cd nella cartella delle cartelle con i file ed esegui find . -mindepth 2 -type f -print -exec mv {} . \; per spostare tutti i file da queste sottodirectory in quello corrente.

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.