「mkdir foo; svn mv * foo」


9

私はよくこのイディオムのいくつかの変形をしたいです:

$ mkdir 2010
$ svn mv * 2010

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

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

"svn mv * 2010"正しいことをする別のワンライナーに置き換える方法はありますか?


これはsvnに固有の質問ではなく、バニラmvにも当てはまります。ただし、を使用すると、エラーは発生しますがmv、問題なくmv * newdir動作します。
crazy2be

回答:


14

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)を含む通常のファイル()のみを照合することです。


3

ZSHには、指定された名前を除くすべてに一致する便利なglob演算子があります^。したがって、これは機能します(ただし、ZSH固有であり、setopt extendedglob最初に行う必要があります)。

$ svn mv ^2010 2010

!()で動作する構文については知っていますzsh^構文はどのように異なりますか?私のシェルでは機能しません、それを有効にするにはどのオプションを設定する必要がありますか?
カレブ

@Caleb申し訳ありませんが、デフォルトでオンになっていると思いましたが、どうやら必要setopt extendedglobです。私は知らなかった!()、それはそれを行うためのよりクロスシェルな方法のように聞こえる
マイケル・ムロゼック

svn mv {^,}2010ディレクトリ名を2回入力するのを避けるため
Gilles 'SO-邪悪なこと

0

ファイルに「使い慣れた」名前が付けられている場合(空白、印刷できない文字、または\[?*):

svn mv $(ls | grep -vx 2010) 2010

2
ファイルは「飼いならされた」名前を持つと信頼することはできません。今まで:) bashとzsh向けに提示されたシェルグロブソリューションは、この問題をうまく回避しています。
カレブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.