web-dev-qa-db-fra.com

Comment copier certains fichiers, mais pas tous?

Vous pouvez donc utiliser le * en tant que caractère générique pour tous les fichiers lors de l'utilisation de cp dans le contexte d'un répertoire. Existe-t-il un moyen de copier tous les fichiers à l'exception du fichier x?

59
Chad Harrison

Dans bash, vous pouvez utiliser extglob:

 $ shopt -s extglob  # to enable extglob
 $ cp !(b*) new_dir/

!(b*) exclut tous les fichiers b*.

Vous pouvez ensuite désactiver extglob avec

 $ shopt -u extglob
46
rush

Rsync gère cela très bien.

Exemple copiez tout: rsync -aP /folder1/* /folder/2

Exemple tout copier avec exclusion: rsync -aP --exclude=x /folder1/* /folder2/

Le -aP commutateur:

a: Similaire à cp -a, récursif, etc. P: affiche la progression, une fonctionnalité intéressante de rsync.

54
Tim

Ce n'est pas une fonctionnalité de cp, c'est une fonctionnalité de votre Shell (il étend le * pour signifier tous les fichiers autres que des points), donc la réponse dépend du Shell que vous utilisez. Par exemple, zsh prend en charge cette syntaxe:

$ cp ^x /path/to/destination

^x signifie "tous les fichiers sauf x"

Vous pouvez également combiner des modèles de sélection et de désélection, par ex. pour copier tous les fichiers wav sauf ceux contenant xyz, vous pouvez utiliser:

cp *.wav~*xyz*
12
Michael Mrozek

Cela pourrait également être fait dans le vieux bourne Shell (portable/compatible) de diverses manières avec des outils standard de manière beaucoup moins élégante que l'utilisation de globalisation ou de commandes avancées avec des options d'exclusion intégrées.

S'il n'y a pas trop de fichiers (et pas avec des noms incluant des espaces et/ou des sauts de ligne), cela pourrait être un moyen:

cp `ls | egrep -v '^excludename$'` destdir/.

Bien sûr, bash et GNU sont excellents et puissants, mais ils ne sont toujours pas toujours disponibles. Si vous avez l'intention de les mettre dans un script portable, je recommanderais find comme dans le commentaire de Rush.

4
MattBianco

Si vous souhaitez tout copier dans un dossier (y compris les sous-dossiers) dans un sous-répertoire particulier:

cp -R $(ls | grep -v '^subdir$') subdir/

Fonctionne avec sh, bash, zsh (au moins).

2
user2707671