2013-01-17 24 views
6

Ad esempio, una cartella può contenere i filecopiare tutti i file in una directory con una particolare stringa nel nome del file nella directory diversa in Bash

12_foo9.dat 
34foo32.txt 
24foobar.png 
997_bar.txt 

e vorrei copiare i file con 'pippo' in i nomi dei file in una directory separata in modo che contenga quei primi tre file ma non il quarto.

Mi sono guardato intorno ma non ho trovato un modo per farlo. La directory ha un numero molto elevato di file, ma solo l'1% circa che devo copiare.

Grazie

risposta

8
$ mkdir NEWDIR 

$ touch foo_file file_foo file_foo_file 

$ ls 
NEWDIR  file_foo file_foo_file foo_file 

$ cp -v *foo NEWDIR/ 
file_foo -> NEWDIR/file_foo 

$ cp -v foo* NEWDIR/ 
foo_file -> NEWDIR/foo_file 

$ cp -v *foo* NEWDIR/ 
file_foo -> NEWDIR/file_foo 
file_foo_file -> NEWDIR/file_foo_file 
foo_file -> NEWDIR/foo_file 

$ ls NEWDIR/ 
file_foo file_foo_file foo_file 
+0

Grazie per l'elaborazione! –

+0

cosa fa -v? – Aaron

0

Usa globbing:

uscita
shopt -s failglob 
echo cp *foo* /path/to/separate 

Questa volontà del comando di copia (o fallire con bash: no match: *foo*).

Rimuovere echo dopo aver convalidato l'output in realtà copia le voci della directory.

+0

Quali benefici significa la "echo" fornire? Non chiarisce quali file verranno inclusi. Se lo desideri, vorrai "ls * foo *" per confermare i file che verranno abbinati, quindi "cp * foo */target" per copiare lo stesso. In realtà, penso che aggiungerò questo suggerimento alla mia risposta ... – DreadPirateShawn

+0

@DreadPirateShawn: Grazie per il commento. Ho aggiornato la mia risposta (testata con Bash v4.2.37). – Johnsyweb

0
cp *foo* /path/to/separate_directory 

Se si desidera convalidare i file che saranno inclusi in primo luogo, l'uso:

ls *foo* 

Questo confermerà i file da corrispondere, quindi è possibile riutilizzare lo stesso schema con la comando cp per eseguire la copia.

4

Prova questa dichiarazione: cp *foo* /newdir

+0

Grazie, è così semplice, mi dispiace per aver chiesto qualcosa di così ovvio! –

+0

NP - Non voglio spaccare per un rappresentante, ma sentitevi libero di accettare questa risposta :-) – dough

2

Se siete veramente preoccupati per il numero di file (ad esempio in esecuzione in milioni) è possibile utilizzare:

find . -type f -depth 1 -name "*foo*" -exec cp {} /otherdir \; -print 

Questo non fa uso di espansione shell, in modo non tenterai di eseguire un comando con un milione di argomenti. Il -print ti dà qualche indicazione sui progressi e può essere lasciato fuori. Per elencare semplicemente i file che devono essere copiati:

find . -type f -depth 1 -name "*foo*" 
Problemi correlati