2009-08-21 15 views
55

Je voudrais copier tous les fichiers d'un répertoire sauf un nommé Default.png. Il semble qu'il y ait plusieurs façons de le faire. Qu'est-ce qui vous semble le plus efficace?BASH copier tous les fichiers sauf un

+0

Pourquoi avez-vous besoin pour sauter ce fichier, plutôt que de simplement le supprimer après l'avoir copié? Existe-t-il déjà dans le répertoire cible? –

+0

Oui, un fichier portant le même nom existe déjà dans le répertoire cible. –

+0

@ LasseV.Karlsen: Ou vous pouvez économiser le temps de le copier, si c'est un gros fichier. Cela m'intéresse mais en excluant un répertoire plutôt qu'un fichier. –

Répondre

34

simple, si src/ contient uniquement les fichiers:

find src/ ! -name Default.png -exec cp -t dest/ {} + 

Si src/ a des sous-répertoires, ce qui les passe sous silence, mais ne copier des fichiers à l'intérieur d'eux:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} + 

Si src/ a des sous-répertoires, ceci ne s'y répète pas:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} + 
+2

Cela s'avère être le meilleur pour moi, car il semblerait que OS X est livré sans globes activé. –

+1

Quelqu'un pourrait-il expliquer à quoi sert le «signe plus» à la fin de la commande? J'ai toujours vu \; à la fin d'une option -exec, est-ce la même chose? – Max

+6

@Max '\;' exécute la commande une fois par fichier. '+' exécute la commande une fois et lui passe tous les noms de fichiers en une seule fois (sous réserve de la limite de longueur de la ligne de commande). '+ 'est un peu plus efficace en général. –

99

devrait être la suivante:

cp -r !(Default.png) /dest 

Si la copie dans un dossier imbriqué dans le dossier en cours (appelé par exemple dans le cas ci-dessous), vous devez d'omettre ce répertoire aussi:

cp -r !(Default.png|example) /example 
+9

Cela produit -bash:!: Événement non trouvé –

+0

Copiez-vous les fichiers dans un dossier imbriqué dans le dossier de votre copie? – Jon

+29

Ceci nécessite que 'shopt -s extglob' fonctionne, s'il a été désactivé. –

3

I faire juste:

cp srcdir/* destdir/ ; rm destdir/Default.png 

sauf si les fichiers sont gros. Sinon, utilisez par ex.

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/ 
+0

grep -v est votre ami –

+1

La première commande n'est pas ce que l'OP a demandé. Si Default.png existe dans les deux répertoires, il remplacera celui de 'destdir' par celui de' srcdir', puis supprimera le 'Default.png' copié. Au lieu de cela, l'OP veut conserver le 'Default.png' qui existe déjà dans' destdir'. – SnowFrog

43

rsync a été mon cp/remplacement scp depuis longtemps:

rsync -av from/ to/ --exclude=Default.png 

-a, --archive    archive mode; equals -rlptgoD (no -H,-A,-X) 
-v, --verbose    increase verbosity 
+2

Votre réponse n'est pas aussi claire pour moi que toutes les commandes rsync. C'est pourquoi je ne l'utilise pas. Qu'est-ce que 'rlptgoD' et qu'est-ce que' HAX'? Pourquoi créez-vous une archive? – Simon

1
cp `ls | grep -v Default.png` destdir 
+5

Ceci est plus susceptible de produire des erreurs que de faire ce que vous avez l'intention. –

+0

Cela me convient le mieux – once

-1
# chattr +i /files_to_exclude 
# cp source destination 
# chattr -i /files_to_exclude 
Questions connexes