2013-03-25 9 views
50

Sotto Unix, voglio copiare tutti i file con una determinata estensione (tutti i file excel) da tutte le sottodirectory in un'altra directory. Ho il seguente comando:Copia tutti i file con una certa estensione da tutte le sottodirectory

cp --parents `find -name \*.xls*` /target_directory/ 

I problemi con questo comando sono:

  • Si copia la struttura di directory come pure, e io voglio solo i file (in modo che tutti i file dovrebbero finire in/directory_destinazione /)

  • Esso non copia i file con spazi nei nomi dei file (che sono un bel po ')

Qualche soluzione per questi problemi?

+0

Che dire di 'find ... exec mv'? – fedorqui

risposta

86

--parents sta copiando la struttura della directory, quindi è necessario liberarsene.

Il modo in cui hai scritto questo, i find esegue, e l'uscita è messo sulla riga di comando in modo tale che cp non può distinguere tra gli spazi che separano i nomi dei file, e gli spazi all'interno il nome del file. E 'meglio fare qualcosa di simile

$ find . -name \*.xls -exec cp {} newDir \; 

in cui cp viene eseguito per ogni nome di file che find trova, e superato il nome del file in modo corretto. Here's more info su questa tecnica.

Invece di tutto quanto sopra, si potrebbe usare zsh e semplicemente digitare

$ cp **/*.xls target_directory 

zsh può espandere i caratteri jolly per includere le sottodirectory e fa questo genere di cose molto facile.

+0

Ci scusiamo per il mio analfabetismo bash, ma cosa intendi per "bin"? – Abdel

+0

Gettare in un cestino. – bmargulies

+1

Sì. 'bin it' significa buttarlo via. Ora modificato :-) –

5

Ho avuto un problema simile. Ho risolto utilizzando:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";" 

Il '{}' e ";" esegue la copia su ogni file.

11

Da tutto quanto sopra, mi è venuta in mente questa versione. Questa versione funziona anche per me nel terminale di ripristino mac.

Apparirà nella directory corrente e in modo ricorsivo in tutte le sottodirectory per i file con estensione xsl. Li copierà tutti nella directory di destinazione.

bandiere CP sono:

  • p - preservare attributi del file
  • r - ricorsivo
  • v - verbose (vi mostra cosa da copiare)
+1

Questo è lo stesso di quello che dovevo fare quando SSH era in Bluehost. – Plummer

1

Ho avuto anche farlo da soloL'ho fatto tramite l'argomento --parents per cp:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;