"mkdir foo; svn mv * foo"

私はしばしばこの慣用語のいくつかのバリエーションを考えています。

$ mkdir 2010
$ svn mv * 2010

もちろん、globも2010と一致するため、エラーが発生します。

svn: Cannot copy path '2010' into its own child '2010/2010'

"svn mv * 2010"正しいことができる他のモノライナーと交換する方法はありますか?

ベストアンサー1

ksh、bashまたはzshから:

svn mv !(2010) 2010

shopt -s extglobBashでは、まず実行(に入れる必要があります)する必要があります~/.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
    
  • ドットファイルがあるがまだ設定していない場合は、glob_dots個別に移動する必要があります。

    svn mv {^,}2010
    svn mv .*~.svn 2010
    

    一度に完了:

    svn mv *~(.svn|2010)(D) 2010
    

この場合(サブディレクトリがない場合)、zshで作業するもう1つの方法は、ドットファイル()を含む通常のファイルsvn mv *(.D) 2010()のみを一致させることです。.D

おすすめ記事