web-dev-qa-db-ja.com

mvコマンドを使用するときにフォルダーを除外する方法

mvコマンドの使用中にディレクトリを除外したい状況があります。構文が!(exclude_dir)になるこの例を見てみましたが、それをテストするシナリオを設定すると、完全に理解できない結果が得られます。

f1f2f3の3つのフォルダーを作成しました。今、私はこの方法でコマンドを使用します:

mv -t f3/ !(f1) f2

これにより、次のエラーが生成されます。

mv: cannot move 'f3' to a subdirectory of itself, 'f3/f3'
mv: cannot stat 'f2': No such file or directory

面白いことに、フォルダーの構造は次のとおりです。

.
├── f1
└── f3
    └── f2

3 directories, 0 files

それは私が望むことをしますが、なぜエラーメッセージが表示されます。明らかに、私はそのコマンドを正しく使用していません。

3
George Udosen

これはmvとは関係ありませんが、 man bash を引用してbash機能です。

extglobShellオプションがshoptビルトインを使用して有効になっている場合、いくつかの拡張パターン一致演算子が認識されます。以下の説明では、パターンリストは、|で区切られた1つ以上のパターンのリストです。複合パターンは、次のサブパターンの1つ以上を使用して形成できます。

!(パターンリスト)
指定されたパターンの1つを除くすべてに一致

!(f1)はあなたの例のf2 f3にマッチするので、効果的にあなたはやっています:

mv -t f3/ f2 f3 f2

目標を達成するには、次のようにする必要があります。

mv -t f3/ !(f[13]) # or !(f1|f3)

この式は、f1およびf3を除くすべてに一致します。

これは、*?、および[…]でも機能します。

$ ls
e1  e2  e3  f1  f2  f3
$ ls !(e*|?[12])
f3
8
dessert

!(f1)は拡張されたグロブ式であるため、(extglob Shellオプションが設定されている場合)a(非)一致ファイルのリスト。つまり、ディレクトリに元々f1f2f3が含まれていた場合、

mv -t f3/ !(f1) f2

として展開する

mv -t f3/ f2 f3 f2

最初のエラーは明らかです。 2番目は、f2を2回移動しようとしますが、2回目に失敗するためです。

4
steeldriver