Je veux souvent faire une variante de cet idiome:
$ mkdir 2010
$ svn mv * 2010
Bien sûr, je reçois une erreur car le glob correspond également à 2010:
svn: Cannot copy path '2010' into its own child '2010/2010'
Y a-t-il un moyen de le remplacer "svn mv * 2010"
par un autre doublure qui fait la bonne chose?
mv
. Cependant, avecmv
,mv * newdir
fonctionne pour moi, mais avec une erreur.Réponses:
Sous ksh, bash ou zsh:
Sous bash, vous devez d'
shopt -s extglob
abord exécuter (mettez-le dans votre~/.bashrc
). Sous zsh, vous devez d'setopt -o ksh_glob
abord exécuter (mettez-le dans votre~/.zshrc
).Cela ne déplace pas les fichiers de points (fichiers dont le nom commence par
.
). Si vous en avez, déplacez-les séparément. Veillez à exclure le.svn
répertoire si vous en avez un. En ksh ou zsh:En bash, c'est plus compliqué car vous devez également exclure explicitement
.
et..
.Zsh a également une syntaxe différente et plus courte, qui nécessite d'être exécutée en
setopt -o extended_glob
premier (encore une fois, mettez-la~/.zshrc
):La première extension de l'entretoise entre en jeu, résultant en
svn mv ^2010 2010
. Ensuite, le modèle^2010
(un raccourci pour «les fichiers correspondent*
mais pas2010
») est développé.Si vous avez un
.svn
répertoire, vous devrez l'exclure du déplacement. C'est ok par défaut, car il.svn
ne correspond pas à*
(c'est un fichier de points). Cependant, il y a des complications:Si vous avez défini l'
glob_dots
option, vous devrez également exclure.svn
:Si vous avez des fichiers de points et que vous ne les avez pas définis
glob_dots
, vous devrez les déplacer séparément:Pour le faire en une seule fois:
Une autre façon qui fonctionnerait dans zsh dans ce cas (si vous n'avez pas de sous-répertoires) est de
svn mv *(.D) 2010
faire correspondre uniquement les fichiers réguliers (.
), y compris les fichiers de points (D
).la source
ZSH a un opérateur utile glob de tout sauf un nom correspond donné
^
. Donc cela fonctionnerait (mais c'est spécifique à ZSH, et vous devez d'setopt extendedglob
abord):la source
!()
syntaxe qui fonctionne aveczsh
. En quoi la^
syntaxe diffère-t-elle? Cela ne fonctionne pas dans mon shell, quelle option devrais-je définir pour l'activer?setopt extendedglob
. Je ne savais pas!()
, ça ressemble à une façon plus cross-shell de le fairesvn mv {^,}2010
pour éviter de taper deux fois le nom du répertoireSi vos fichiers ont des noms «apprivoisés» (pas d'espaces, de caractères non imprimables ou
\[?*
):la source