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.