Ainsi, vous pouvez utiliser le *comme un joker pour tous les fichiers lorsque vous l'utilisez cpdans le contexte d'un répertoire. Est-il possible de copier tous les fichiers sauf xfichier?
Ainsi, vous pouvez utiliser le *comme un joker pour tous les fichiers lorsque vous l'utilisez cpdans le contexte d'un répertoire. Est-il possible de copier tous les fichiers sauf xfichier?
Réponses:
En bashvous 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 extglobavec
$ shopt -u extglob
findc'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 -aPcommutateur:
a: similaire à cp -a, récursif, etc. P: affiche les progrès, une fonctionnalité intéressante de rsync.
-rPplutôt que -aPsi vous voulez recurse. -aest pour l'archivage. Vous ne savez pas si cela a changé ou si c'est simplement différent sous MacOS.
rsynca 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, zshprend en charge cette syntaxe:
$ cp ^x /path/to/destination
Où ^xsignifie "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 bashoutils 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 findcomme 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