mv
コマンドの使用中にディレクトリを除外したい状況があります。構文が!(exclude_dir)
になるこの例を見てみましたが、それをテストするシナリオを設定すると、完全に理解できない結果が得られます。
f1
、f2
とf3
の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
それは私が望むことをしますが、なぜエラーメッセージが表示されます。明らかに、私はそのコマンドを正しく使用していません。
これは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
!(f1)
は拡張されたグロブ式であるため、(extglob
Shellオプションが設定されている場合)a(非)一致ファイルのリスト。つまり、ディレクトリに元々f1
、f2
、f3
が含まれていた場合、
mv -t f3/ !(f1) f2
として展開する
mv -t f3/ f2 f3 f2
最初のエラーは明らかです。 2番目は、f2
を2回移動しようとしますが、2回目に失敗するためです。