Ho anche 50 cartelle con alcune sottocartelle, con un totale di oltre 1000 file audio. Devo rimuovere tutte le sottocartelle e mettere tutti i file al livello attuale. Ho provato mv */* ./
ma si lamenta: elenco argomenti troppo lungo
Ho anche 50 cartelle con alcune sottocartelle, con un totale di oltre 1000 file audio. Devo rimuovere tutte le sottocartelle e mettere tutti i file al livello attuale. Ho provato mv */* ./
ma si lamenta: elenco argomenti troppo lungo
Risposte:
Presumo che l'estensione dei tuoi file audio sia .mp3
find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +
Sostituisci .mp3
con l'estensione dei tuoi file audio
Sostituisci <AudioParentFolderPath>
con la cartella principale che contenga le tue sottocartelle.
Sostituisci <YourTargetFolder>
con il percorso della cartella in cui devi inserire tutti i file.
Se i file di rimorchio da sottocartelle diverse hanno lo stesso nome, ne verrà spostato solo uno.
modifica: Come ha detto Costas : "L' -i
interruttore rende mv
interattivo, verrà richiesto prima di sovrascrivere i file esistenti"
-t
consenti di specificare prima la destinazione. dalla mv
pagina del manuale: -t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
find . -type f -mindepth 2 -exec mv -t ./ {} +
Si noti che quel comando sovrascriverà tutti i file con lo stesso nome. È possibile utilizzare questo per essere richiesto prima di sovrascrivere:
find . -type f -mindepth 2 -exec mv -it ./ {} +
-type f
: trova solo file regolari.-mindepth 2
: trova solo i file nelle sottodirectory.-exec mv -it ./ {}
: -exec
significa "esegui questo comando su ogni file trovato". Il {}
sarà sostituito con i nomi dei file. Lo -i
switch rende mv
interattivo, verrà richiesto prima di sovrascrivere i file esistenti e -t
imposta la directory di destinazione su ./
.+
: mette insieme i file (in una riga dell'argomento) quanti sono gli shell che possono operare con il comando per invocare i tempi minimi di comando (non uno per uno ma uno a più).Per quanto riguarda le ulteriori eliminazioni di cartelle vuote puoi usare lo stesso recepie:
find . -type d -empty -delete
-type f
seleziona solo file semplici, esclusi collegamenti simbolici, pipe denominate e simili. Per spostare tutti i file diversi dalle directory che puoi fare ! -type d
.
-L
parametro
-i
è standard, -t
è solo GNU (niente a che fare con Linux, che è solo un kernel trovato in alcuni sistemi GNU e non GNU)
-t
non esiste su alcuni sistemi (come un AIX non così antico)
find . -type f -mindepth 2 -exec mv {} ./ \;
Sì, questo è un limite alla dimensione cumulativa degli argomenti e dell'ambiente passati alla execve()
chiamata di sistema quando si esegue un comando esterno.
Con zsh
, puoi invece usare il suo builtin mv
:
zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .
Oppure usa zargs
per spezzare l'elenco in blocchi gestibili:
autoload zargs
zargs -Ifiles ./*/* -- mv files .
Con ksh93
:
command -x mv ./*/* .
Con GNU xargs
e GNU mv
con una shell in cui printf
è incorporato (la maggior parte, mksh
essendo la notevole eccezione):
printf '%s\0' ./*/* | xargs -r0 mv -t .
zsh
caso in cui puoi mettere alcuni qualificatori glob , ad esempio (.)
o (^/)
dopo l'ultimo *
.
Una soluzione abbastanza portatile potrebbe essere:
trova tutti i file in ogni sottocartella e spostali nella directory corrente
find ./*/ -type f -print | xargs mv -i "{}" ./
Puoi aggiungere una via | egrep "\.au$|\.mp3$|\.ac3$"
di mezzo per assicurarti che i file che hai trovato siano file con estensione audio (aggiungi tutte le estensioni necessarie per coprire tutti i tipi, ne fornisco solo 3 comuni)
find
affatto. Quanto basta echo
oprintf
find
non risolvere il problema ma xargs
farlo.
t
potrebbe essere per "target"?