web-dev-qa-db-fra.com

Commande cp pour exclure certains fichiers de la copie

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

30
Stephen Jacob

Utilisez rsyncname__:

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

Notez que l'utilisation de sourceet de source/ est différente. Une barre oblique finale signifie que le contenu du dossier sourceest copié dans destinationname__. Sans la barre oblique finale, cela signifie que vous copiez le dossier source dans destinationname__.

Sinon, si vous devez exclure de nombreux répertoires (ou fichiers), 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é depuis: https://stackoverflow.com/a/2194500/749232

Si vous souhaitez utiliser cplui-même:

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

Cela suppose que la structure du répertoire cible soit la même que celle de la source.

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

53
saji89

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 résultats négatifs :

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

Ceci supporte également plusieurs modèles sans correspondance:

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3
3
xenoid