Est-il possible d'utiliser la commande 'cp' pour copier un répertoire et exclure certains fichiers/sous-répertoires qu'il contient?
Utilisez rsync
name__:
rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Notez que l'utilisation de source
et de source/
est différente. Une barre oblique finale signifie que le contenu du dossier source
est copié dans destination
name__. Sans la barre oblique finale, cela signifie que vous copiez le dossier source dans destination
name__.
Sinon, si vous devez exclure de nombreux répertoires (ou fichiers), vous pouvez utiliser --exclude-from=FILE
, où FILE
est 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 cp
lui-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
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