Ainsi, vous pouvez utiliser le *
comme un joker pour tous les fichiers lorsque vous l'utilisez cp
dans le contexte d'un répertoire. Est-il possible de copier tous les fichiers sauf x
fichier?
54
En bash
vous pouvez utiliser extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
où !(b*)
exclure tous les b*
fichiers.
Vous pouvez plus tard désactiver extglob
avec
$ shopt -u extglob
find
c'est le seul moyen d'entrertcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync s'en occupe bien.
Exemple copier tout:
rsync -aP /folder1/* /folder/2
Exemple de copie avec exclusion:
rsync -aP --exclude=x /folder1/* /folder2/
Le
-aP
commutateur:a: similaire à
cp -a
, récursif, etc. P: affiche les progrès, une fonctionnalité intéressante de rsync.la source
-rP
plutôt que-aP
si vous voulez recurse.-a
est pour l'archivage. Vous ne savez pas si cela a changé ou si c'est simplement différent sous MacOS.rsync
a la possibilité de le rendre récursif. Exemple:rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Testé uniquement sur Ubuntu)Ce n'est pas une fonctionnalité de
cp
, c'est une fonctionnalité de votre shell (cela étend le terme*
à tous les fichiers non-point), donc la réponse dépend du shell que vous utilisez. Par exemple,zsh
prend en charge cette syntaxe:Où
^x
signifie "tous les fichiers saufx
"Vous pouvez également combiner des modèles de sélection et de désélection. Par exemple, pour copier tous les fichiers wav sauf ceux contenant xyz, vous pouvez utiliser:
la source
bash
?Pourrait également être utilisé dans une vieille coque simple (portable / compatible) de différentes manières avec des outils standard, de manière beaucoup moins élégante que dans une utilisation avancée de la coquille ou des commandes avec des options d'exclusion intégrées.
S'il n'y a pas trop de fichiers (et pas avec des noms comprenant des espaces et / ou des sauts de ligne), cela pourrait être un moyen:
Bien sûr, les
bash
outils GNU sont excellents et puissants, mais ils ne sont toujours pas disponibles. Si vous avez l'intention de le mettre dans un script portable, je le recommanderaisfind
comme dans le commentaire de Rush.la source
Si vous souhaitez copier tout le contenu d'un dossier (y compris les sous-dossiers) dans un sous-répertoire particulier:
Fonctionne avec sh, bash, zsh (au moins).
la source
cp -R * subdir/
cp
(pas debash
/sh
), "cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
". La copie se termine correctement, cependant. Malheureusement, votre variante rompt avec tout nom de fichier contenant un espace ou une ponctuation sensible à un shell. Voir unix.stackexchange.com/q/128985/135943extglob
est le meilleur moyen jusqu’à présent, je suppose.Une autre façon utilise
cp $(ls --ignore=x) subdir/
la source
$
etc.) Ne jamais analyser la sortie dels
. unix.stackexchange.com/q/128985/135943