copiare tutte le cartelle tranne alcune da shell

Forum dedicato agli studenti del corso linux e a tutti gli amanti del pinguino!

Moderatore: matteo

copiare tutte le cartelle tranne alcune da shell

Messaggioda Michele » mar dic 02, 2008 3:37 pm

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:
Michele
 
Messaggi: 308
Iscritto il: ven mar 17, 2006 2:14 am

Re: copiare tutte le cartelle tranne alcune da shell

Messaggioda andrea » mar dic 02, 2008 4:13 pm

Ottima dritta! :)
Una curiosità... i comandi per aggiungere e soprattutto togliere la "a" dal nome del file quali sono?
andrea
 
Messaggi: 42
Iscritto il: mar ott 09, 2007 10:28 am

Re: copiare tutte le cartelle tranne alcune da shell

Messaggioda matteo » mar dic 02, 2008 9:43 pm

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
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am

Re: copiare tutte le cartelle tranne alcune da shell

Messaggioda francesco » gio dic 03, 2009 4:37 pm

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
francesco
 
Messaggi: 25
Iscritto il: dom mar 19, 2006 11:59 pm

Re: copiare tutte le cartelle tranne alcune da shell

Messaggioda matteo » gio dic 03, 2009 5:12 pm

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
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am


Torna a Unix, Linux & reti

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti

cron