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?
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?
Réponses:
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'entrer tcsh
: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.
-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:
$ cp ^x /path/to/destination
Où ^x
signifie "tous les fichiers sauf x
"
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:
cp *.wav~*xyz*
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:
cp `ls | egrep -v '^excludename$'` destdir/.
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 recommanderais find
comme dans le commentaire de Rush.
Si vous souhaitez copier tout le contenu d'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).
cp -R * subdir/
cp
(pas de bash
/ 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/135943
extglob
est le meilleur moyen jusqu’à présent, je suppose.
Une autre façon utilise
cp $(ls --ignore=x) subdir/
$
etc.) Ne jamais analyser la sortie de ls
. unix.stackexchange.com/q/128985/135943