Ich möchte oft eine Variante dieser Redewendung machen:
$ mkdir 2010
$ svn mv * 2010
Natürlich bekomme ich eine Fehlermeldung, weil der Glob auch mit 2010 übereinstimmt:
svn: Cannot copy path '2010' into its own child '2010/2010'
Gibt es eine Möglichkeit, durch "svn mv * 2010"
einen anderen Einzeiler zu ersetzen , der das Richtige tut?
mv
. Funktioniert jedoch mitmv
,mv * newdir
wenn auch mit einem Fehler.Antworten:
Unter ksh, bash oder zsh:
Unter Bash müssen Sie
shopt -s extglob
zuerst laufen (legen Sie es in Ihre~/.bashrc
). Unter zsh müssen Siesetopt -o ksh_glob
zuerst ausführen (in Ihre einfügen~/.zshrc
).Dadurch werden keine Punktdateien verschoben (Dateien, deren Name mit beginnt
.
). Wenn Sie welche haben, verschieben Sie sie separat. Achten Sie darauf, das.svn
Verzeichnis auszuschließen, falls Sie eines haben. In ksh oder zsh:In bash ist dies komplizierter, da Sie auch explizit
.
und ausschließen müssen..
.Zsh hat auch eine andere, kürzere Syntax, die
setopt -o extended_glob
zuerst ausgeführt werden muss (setzen Sie diese erneut ein~/.zshrc
):Die erste Klammererweiterung kommt ins Spiel, was dazu führt
svn mv ^2010 2010
. Dann wird das Muster^2010
(eine Verknüpfung für "Dateien übereinstimmen,*
aber nicht2010
") erweitert.Wenn Sie ein
.svn
Verzeichnis haben, müssen Sie es vom Umzug ausschließen. Dies ist standardmäßig in Ordnung, da.svn
es nicht mit übereinstimmt*
(es ist eine Punktdatei). Es gibt jedoch Komplikationen:Wenn Sie die
glob_dots
Option festgelegt haben, müssen Sie auch Folgendes ausschließen.svn
:Wenn Sie Punktdateien haben und diese nicht festgelegt haben
glob_dots
, müssen Sie sie separat verschieben:Um es auf einmal zu tun:
Eine andere Möglichkeit, die in diesem Fall in zsh funktioniert (wenn Sie keine Unterverzeichnisse haben), besteht darin
svn mv *(.D) 2010
, nur reguläre Dateien (.
) einschließlich Punktdateien (D
) abzugleichen .quelle
ZSH hat einen hilfreichen Glob-Operator, der alles außer einem Vornamen abgleichen kann
^
. Das würde also funktionieren (aber es ist ZSH-spezifisch und Sie müssen essetopt extendedglob
zuerst tun ):quelle
!()
Syntax, mit der funktioniertzsh
. Wie unterscheidet sich die^
Syntax? In meiner Shell funktioniert es nicht. Welche Option müsste ich einstellen, um es zu aktivieren?setopt extendedglob
. Ich wusste es nicht!()
, es klingt nach einer eher Cross-Shell-Methodesvn mv {^,}2010
um zu vermeiden, dass der Verzeichnisname zweimalWenn Ihre Dateien "zahme" Namen haben (kein Leerzeichen, nicht druckbare Zeichen oder
\[?*
):quelle