BASH copie tous les fichiers sauf un


110

Je voudrais copier tous les fichiers d'un répertoire à l'exception d'un nommé Default.png. Il semble qu'il existe plusieurs façons de procéder. Qu'est-ce qui vous semble le plus efficace?


Pourquoi en avez-vous besoin pour ignorer ce fichier, au lieu de simplement le supprimer après l'avoir copié? Existe-t-il déjà dans le répertoire cible?
Lasse V. Karlsen

1
Oui, un fichier du même nom se trouve déjà dans le répertoire cible.
Joe Cannatti

@ LasseV.Karlsen: Ou vous pouvez gagner du temps pour le copier, s'il s'agit d'un gros fichier. Je suis intéressé par cela mais en excluant un répertoire plutôt qu'un fichier.
Nikana Reklawyks

Réponses:


54

Simple, s'il src/ne contient que des fichiers:

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

Si src/a des sous-répertoires, cela les omet, mais copie les fichiers à l'intérieur d'eux:

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

Si src/a des sous-répertoires, cela ne les réintègre pas:

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

5
Cela s'avère être le meilleur pour moi car il semblerait que OS X soit livré sans glob activé.
Joe Cannatti

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

149

Devrait être comme suit:

cp -r !(Default.png) /dest

Si vous copiez dans un dossier imbriqué dans le dossier actuel (appelé exemple dans le cas ci-dessous), vous devez également omettre ce répertoire:

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

17
Cela produit -bash:!: Événement non trouvé
Joe Cannatti

Copiez-vous les fichiers dans un dossier imbriqué dans le dossier à partir duquel vous effectuez la copie?
Jon

47
Cela nécessite shopt -s extglobde fonctionner, s'il a été désactivé.
Barry Kelly

5
Il semble que OS X doit être utilisé shopt -s extglobcomme décrit par @BarryKelly. Avec cela, cela fonctionne parfaitement.
Kat

Des années sur Bash et je ne savais pas !()... Magnifique! Pour ceux qui - comme moi - estiment qu'il est temps d'étudier / revoir bash , voici les liens pertinents liés à cette question / réponse: shopt / extglob et le modèle .
Brandt

73

rsync a été mon remplaçant cp / scp depuis longtemps:

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

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

Si je veux exclure deux fichiers différents, comment puis-je l'utiliser?
Pulkit Bansal

plusieurs --exclude = les arguments sont pris en charge. Et n'oubliez pas l' -rargument si vous synchronisez des répertoires
Rian Sanderson

5

Je ferais juste:

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

sauf si les fichiers sont volumineux. Sinon, utilisez par exemple

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

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

2
que diriez-vous de default.png existe déjà dans destdir? Votre solutioun ne fonctionnera pas.
Iman Mohamadi

2

Cela fonctionne très bien pour tout copier sauf les modules de nœuds :) profitez-en et grâce aux réponses ci-dessus, je viens de l'ajouter. Rsync est meilleur à mon avis que CP car vous pouvez voir la barre de progression sans la demander.

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules


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

-2

utiliser le paramètre d'expansion du shell avec regex

cp /<path>/[^not_to_copy_file]* .

Tout sera copié à l'exception du not_to_copy_file

- si quelque chose ne va pas avec cela. veuillez préciser !


1
Bienvenue à SO. Malheureusement, votre réponse n'est pas correcte. L'expression entre crochets ( [...]) contient un ensemble de caractères à faire correspondre, tandis qu'un début ^provoquera une correspondance du complément des caractères répertoriés. Dans l'exemple suivant, aucun fichier ne sera répertorié: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*parce que tous les noms de fichiers commençant par l' un des caractères suivants seront exclus: _cefilnopty.
rtx13 le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.