私はよくこのイディオムのいくつかの変形をしたいです:
$ mkdir 2010
$ svn mv * 2010
もちろん、グロブも2010と一致するため、エラーが発生します。
svn: Cannot copy path '2010' into its own child '2010/2010'
"svn mv * 2010"
正しいことをする別のワンライナーに置き換える方法はありますか?
私はよくこのイディオムのいくつかの変形をしたいです:
$ mkdir 2010
$ svn mv * 2010
もちろん、グロブも2010と一致するため、エラーが発生します。
svn: Cannot copy path '2010' into its own child '2010/2010'
"svn mv * 2010"
正しいことをする別のワンライナーに置き換える方法はありますか?
回答:
ksh、bash、またはzshの場合:
svn mv !(2010) 2010
bashでは、shopt -s extglob
最初に実行する必要があります(それをに入れます~/.bashrc
)。zshでは、setopt -o ksh_glob
最初に実行する必要があります(それをに入れます~/.zshrc
)。
これはドットファイル(名前がで始まるファイル)を移動しません.
。持っている場合は、別々に移動してください。.svn
ディレクトリがある場合は、ディレクトリを除外するように注意してください。kshまたはzshの場合:
svn mv !(2010) .!(svn) 2010
bashでは、.
およびも明示的に除外する必要があるため、これはより複雑になり..
ます。
svn mv !(2010) .!(svn|.|) 2010
また、Zshには異なる短い構文があり、setopt -o extended_glob
最初に実行する必要があります(これもに入れます~/.zshrc
)。
svn mv {^,}2010
最初のブレース拡張が機能し、結果としてになりsvn mv ^2010 2010
ます。次に、パターン^2010
(「一致する*
が一致しないファイル」のショートカット2010
)が展開されます。
あなたが持っている場合は.svn
、ディレクトリを、あなたは移動から除外する必要があります。これはデフォルトで.svn
は問題ありません*
(ドットファイルです)。ただし、複雑な点があります。
このglob_dots
オプションを設定した場合は、除外する必要.svn
もあります。
svn mv !(2010|.svn) 2010 # requires setopt ksh_glob
svn mv *~(.svn|2010) 2010 # requires setopt extended_glob
dotファイルがありglob_dots
、を設定していない場合は、個別に移動する必要があります。
svn mv {^,}2010
svn mv .*~.svn 2010
それを一度に行うには:
svn mv *~(.svn|2010)(D) 2010
この場合(サブディレクトリがない場合)zshで機能するもう1つの方法はsvn mv *(.D) 2010
、.
ドットファイル(D
)を含む通常のファイル()のみを照合することです。
ZSHには、指定された名前を除くすべてに一致する便利なglob演算子があります^
。したがって、これは機能します(ただし、ZSH固有であり、setopt extendedglob
最初に行う必要があります)。
$ svn mv ^2010 2010
!()
で動作する構文については知っていますzsh
。^
構文はどのように異なりますか?私のシェルでは機能しません、それを有効にするにはどのオプションを設定する必要がありますか?
setopt extendedglob
です。私は知らなかった!()
、それはそれを行うためのよりクロスシェルな方法のように聞こえる
svn mv {^,}2010
ディレクトリ名を2回入力するのを避けるため
mv
にも当てはまります。ただし、を使用すると、エラーは発生しますがmv
、問題なくmv * newdir
動作します。