Pagina 1 di 1

copiare tutte le cartelle tranne alcune da shell

MessaggioInviato: mar dic 02, 2008 3:37 pm
da Michele
Questo comando che mi ha passato Matt è utilissimo!
Immagino che avete sempre avuto la necessità di copiare alcune directory e di solito da interfaccia grafica basta selezionare solo quelle che ci servono!
Da shell una soluzione potrebbe essere la seguente, rinominare le cartelle che non servono aggiungendoci una "a" davanti e usare il comando:
Codice: Seleziona tutto
cp -r [b-z]* destinazione


un po' macchinoso ma mi estremamente utile! :mrgreen:

Re: copiare tutte le cartelle tranne alcune da shell

MessaggioInviato: mar dic 02, 2008 4:13 pm
da andrea
Ottima dritta! :)
Una curiosità... i comandi per aggiungere e soprattutto togliere la "a" dal nome del file quali sono?

Re: copiare tutte le cartelle tranne alcune da shell

MessaggioInviato: mar dic 02, 2008 9:43 pm
da matteo
michele ha scritto:Questo comando che mi ha passato Matt è utilissimo!

wow.. mi stai facendo da forwarder :-D ... a quanti siamo arrivati?
comunque il -a è meglio del -r, infatti il -r non mantiene i permessi dei file e non si comporta un granchè bene se trova i link (copia i file originali).
il -a è un sinonimo di -dpPR ovvero, non seguire i link, mantieni i permessi (v. man cp per ulteriori dettagli)
limitare i caratteri jolly è una pratica utile quando non si è sicuri.
Per esempio, se in una directory ci sono solamente file e dir dalla a alla z minuscole
# rm -r *
chi si fida? io no. anche se so che funziona, basta un errore piccolo a cancellare l'intero disco.
# rm -r [a-z]*
avrà lo stesso effetto, ma sono più sicuro.

e se voglio cancellare tutti i file e dir nascosti (quelli che cominciano per .)?
in teoria è
# rm -r .*
...
...
...
provatelo e poi fatemi sapere, ma prima fate un backup di tutto il disco, perchè se lo cancellate come root (o con il sudo) cancellerete l'intero disco.
e allora come faccio ad eliminare solo i file nascosti?
# rm -r .[a-z]*
è la risposta

andrea ha scritto:Una curiosità... i comandi per aggiungere e soprattutto togliere la "a" dal nome del file quali sono?

cosa intendi?

Matteo

Re: copiare tutte le cartelle tranne alcune da shell

MessaggioInviato: gio dic 03, 2009 4:37 pm
da francesco
Ciao a tutti,
a puro scopo di documentazione, anche se fuori tempo posto la mia proposta:

Copia tutti i file eccetto 2, 3 ecc.

#ls |grep -v '\(nomefile1\)\|\(nomefile2\)'> ../lista

#for i in `cat ../lista` ; do cp [-a oppure -R ] "$i" /directory_destinazione; done #copia i file che stanno dentro ../lista


#grep -v '\(file1\)\|\(file2\)\|....' #puoi aggiungere altri file da escludere. -v dice a grep di invertire il criterio di match cioè mostra il con
trario di quello che soddisfa. di solito lo uso anche con rm -r, per questo la lista la salvo nella dir ../ altrimenti me la rimuovo o ricopio da solo ...
Saluti, Fra

Re: copiare tutte le cartelle tranne alcune da shell

MessaggioInviato: gio dic 03, 2009 5:12 pm
da matteo
francesco ha scritto:Ciao a tutti,
a puro scopo di documentazione, anche se fuori tempo posto la mia proposta:

Se lo facevi ieri sarebbe stato un anno esatto :-D

francesco ha scritto:#ls |grep -v '\(nomefile1\)\|\(nomefile2\)'> ../lista

#for i in `cat ../lista` ; do cp [-a oppure -R ] "$i" /directory_destinazione; done #copia i file che stanno dentro ../lista


Oppure
#ls|egrep -v 'nomefile1|nomefile2' | xargs -I '{}' cp -a '{}' /dest

okkio che con il grep nomefile1 è una _parte_ del nome del file, il che significa che ometterebbe anche nomefile1.txt; per risolvere
#ls|egrep -v ^'nomefile1|nomefile2'$ | xargs -I '{}' cp -a '{}' /dest

oppure lo si può sfruttare a vantaggio:
#ls|egrep -v ^'a|c' | xargs -I '{}' cp -a '{}' /dest
ometti tutti quelli che cominciano per a o c

#ls|egrep -v '^a|c$' | xargs -I '{}' cp -a '{}' /dest
ometti tutti quelli che cominciano per a o che finiscono per c


egrep sfrutta le extended regular expression, quindi non hai bisogno di fare il quoting di ogni singolo simbolo

Se non erro qualcosa sulle regular expression l'avevo già postata sul forum.



oppure
#vi ../excludefile
^a
c$
^nomefile3$
\.

poi
#ls|egrep -vf ../excludefile | xargs -I '{}' cp -a '{}' /dest
omette tutti i file che cominciano per a, quelli che finiscono per c, il file nomefile3, e tutti i file che hanno almeno un puntino

chiaramente se al grep togli il -v copi solo questi file menzionati.


Matteo