Commande cp pour exclure certains fichiers de la copie

35

Est-il possible d'utiliser la commande 'cp' pour copier un répertoire et exclure certains fichiers / sous-répertoires qu'il contient?

Stephen Jacob
la source

Réponses:

57

Utiliser rsync:

rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

Notez que l'utilisation sourceet source/sont différentes. Un slash de fin signifie que le contenu du dossier est copié sourcedans destination. Sans la barre oblique finale, cela signifie que vous devez copier la source du dossier destination.

Par ailleurs, si vous avez beaucoup de répertoires (ou fichiers) à exclure, vous pouvez utiliser --exclude-from=FILE, où FILEest le nom d'un fichier contenant des fichiers ou des répertoires à exclure.

--exclude peut également contenir des caractères génériques, tels que --exclude=*/.svn*

Copié à partir de: https://stackoverflow.com/a/2194500/749232

Si vous voulez vous utiliser cp:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

Cela suppose que la structure du répertoire cible est identique à celle du source.

Copié à partir de: https://stackoverflow.com/a/4586025/749232

saji89
la source
3

Tard dans le jeu, voici une solution très différente utilisant plain bash et cp: vous pouvez utiliser une spécification de fichier globale tout en ignorant certains fichiers.

Supposons que le répertoire contient les fichiers:

$ ls *
listed1  listed2  listed3  listed4  unlisted1  unlisted2  unlisted3

En utilisant la variable GLOBIGNORE :

$ export GLOBIGNORE='unlisted*'
$ ls *
listed1  listed2  listed3  listed4

Ou avec des exclusions plus spécifiques:

$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1  listed2  listed3  listed4  unlisted3

Ou en utilisant des correspondances négatives :

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

Cela prend également en charge plusieurs modèles inégalés:

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3
xénoïde
la source
1
Pour les correspondances négatives, vous devez activer les globs étendus:, shopt -s extglobvous n'avez pas non plus besoin d'exporter GLOBIGNORE: il est supposé modifier le comportement du shell actuel, la plupart des programmes enfants ne s'en soucient pas.
Muru