2010-09-08 15 views
29

A volte ho bisogno di eseguire seguente comandocomando cp dovrebbe ignorare alcuni file

cp -rv demo demo_bkp 

Tuttavia voglio ignorare tutti i file nella directory .git. Come lo realizzo? Ci vuole molto tempo per copiare i file .git e non ho bisogno di questi file.

+0

Possibile duplicato di [Copia cartella in modo ricorsivo, escluse alcune cartelle] (http://stackoverflow.com/questions/2193584/copy-folder-recursively-excluding-some-folders) –

risposta

71

Per ignorare in modo specifico una directory git, vorrei inserire prima try git export.

Tuttavia, in generale, per copiare un albero di directory escludendo determinati file o cartelle, è consigliabile utilizzare rsync anziché cp. La sintassi è per lo più lo stesso, ma rsync ha modo più opzioni, tra cui uno per escludere i file selezionati:

rsync -rv --exclude=.git demo demo_bkp 

Vedi esempio the man page per maggiori informazioni.

+0

Non sono sicuro se ci siano altre opzioni che avrebbero impedito questo, o è qualcosa che ha a che fare con le versioni di Linux, ma se seguo il tuo esempio ottengo 'demo' come una sottodirectory di' demo_bkp'. Tuttavia, usando 'rsync -rv --exclude =.git demo/demo_bkp' crea una nuova directory che contiene tutti i file della prima directory. –

8

OK. Preparati. Questo non è carino

find demo -depth -name .git -prune -o -print0 | cpio -0pdv --quiet demo_bkp 

Cosa sta succedendo qui?

  1. find demo | cpio -p demo_bkp trova i file corrispondenti qualsiasi criterio che si desidera e usi cpio per copiare loro (la cosiddetta modalità "pass-through").

  2. find -depth modifica l'ordine in cui i file vengono stampati per corrispondere all'ordine che cpio desidera.

  3. find -name .git -prune indica che non è stato possibile recuperare le directory .git.

  4. find -print0 | cpio -0 ha trovato utilizzare i caratteri NUL (\0) per separare i nomi di file. Questo è per la massima robustezza nel caso in cui ci siano file con nomi strani con spazi, righe nuove o altri caratteri insoliti.

  5. cpio -d crea directory se necessario.

  6. cpio -v --quiet stampa ogni nome di file mentre omette il messaggio "X blocchi copiati" cpio normalmente stampa alla fine.

+0

Non è possibile utilizzare questa soluzione per il dato caso ma grazie per aver illustrato la tua risposta. Sono sicuro che lo userò in un altro momento. –

2

penso che questo farà il trucco:

cd demo 
find . -not -path \*/.\* -type d -exec mkdir -p -- ../demo_bkp/{} \; 
find . -not -path \*/.\* -type f -exec cp -- {} ../demo_bkp/{} \; 

primo trova e crea ogni directory. Quindi trova e copia ciascun file.

Nota che non funzionerà con file speciali (collegamenti simbolici, ecc.).

Problemi correlati