58 votes

commande cp pour exclure certains fichiers de la copie

Existe-t-il un moyen d'utiliser le cp pour copier un répertoire et exclure certains fichiers/sous-répertoires qu'il contient ?

87voto

saji89 Points 11609

Utilice rsync :

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

Notez que l'utilisation de source y source/ sont différentes. Une barre oblique de fin signifie qu'il faut copier le contenu du dossier source en destination . Sans le slash de fin, cela signifie copier le dossier source dans destination .

Alternativement, si vous avez beaucoup de répertoires (ou de fichiers) à exclure, vous pouvez utiliser la commande --exclude-from=FILEFILE est le nom d'un fichier contenant les fichiers ou les répertoires à exclure.

-av signifie mode archive et verbeux.

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

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

Si vous voulez 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 est la même que celle de la source.

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

10voto

xenoid Points 4949

J'interviens tardivement, mais voici une solution très différente qui utilise le simple 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

Utilisation de la GLOBIGNORE variable :

$ 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 correspondances négatives :

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

Ce système prend également en charge plusieurs motifs non appariés :

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

1voto

Jack Points 11

Démarrage rapide

Cours :

rsync -av --exclude='path1/in/source' --exclude='path2/in/source' [source]/ [destination]

Notes

  • -avr va créer un nouveau répertoire nommé [destination] .
  • source y source/ créent des résultats différents :
    • source - copier le contenu de la source vers la destination.
    • source/ - copier le dossier de la source à la destination.
  • Pour exclure plusieurs fichiers :
    • --exclude-from=FILE - FILE est le nom d'un fichier contenant d'autres fichiers ou répertoires à exclure.
  • --exclude peut également contenir des caractères génériques :
    • par exemple --exclude=*/.svn*

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


Exemple

Structure du dossier de départ :

.
 destination
 source
     fileToCopy.rtf
     fileToExclude.rtf

Cours :

rsync -av --exclude='fileToCopy.rtf' source/ destination

Fin de la structure du dossier :

.
 destination
    fileToExclude.rtf
 source
     fileToCopy.rtf
     fileToExclude.rtf

1voto

Cadot.eu Points 11

Vous pouvez utiliser cp avec le ! caractère.

Par exemple, pour exclure le ou les fichiers file.txt , test.jpg et le répertoire nodir tout en copiant tous les autres à partir de l source dans le répertoire destination vous pouvez exécuter :

cp source/!(file.txt|test.jpg|nodir) destination

Si vous avez, par exemple, une structure de fichier comme celle-ci :

.
 destination
 source
     file.rtf
     file.txt
     test.jpg
     yes
    |     test.jpg 
     nodir
          other.jpg

Le résultat après l'exécution de la commande ci-dessus est :

.
 source (not modified)
 destination
     file.rtf
     yes
          test.jpg 

Voici un article contenant des informations sur rsync y cp avec exclure : Comment copier cp et exclure les fichiers ou répertoires internes (équivalent à rsync -exclude)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X