業務でサーバのファイルを移動しようとmvコマンドを使った時の話。
以下のコマンドを実行したかったのに誤って
$ mv *.hoge ~
これで実行してしまった。
$ mv *.hoge
この時。*.hoge
に該当するファイルは以下の2つ
$ ls *.hoge
test_1.hoge test_2.hoge
$
$ cat test_1.hoge
111111
$
$ cat test_2.hoge
2222222
すると以下のように。
$ ls *.hoge
test_2.hoge
$
$ cat test_2.hoge
111111
幸い、問題ないファイルだったので良かったのですが
ちょっと挙動に興味が出てきたので実験。
さきほどと同じ2つのファイルを用意し、3つ目のファイルを追加。
$ ls *.hoge
test_1.hoge test_2.hoge test_3.hoge
$
$ cat test_1.hoge
111111
$
$ cat test_2.hoge
2222222
$
$ cat test_3.hoge
333333
この状態でさきほどのコマンドを実行
$ mv *.hoge
mv: target `test_3.hoge' is not a directory
test_3.hoge
はディレクトリちゃうぞと。
ここで↓をたまたま発見。
http://d.hatena.ne.jp/m-hiyama/20081211/1228976433
Unixでは、ワイルドカード展開をシェルがするので、cp foo/* bar は、cp foo/a.txt foo/b.txt bar と同じです。
つまり*.hoge
に該当したファイルがたまたま2つあった故に後者を移動先とみなして
以下が成立した。
$ mv test_1.hoge test_2.hoge
*.hoge
に該当したファイルが3つ以上あると
mv test_1.hoge test_2.hoge test_3.hoge
となり、この場合は最後の引数がディレクトリであれば成立するようだ。
test_3.hoge
配下にtest_1.hoge
とtest_2.hoge
を移動しようとしたためエラーが出た。
(てかmvって引数3つ以上でも可能なパターンあったんだ)
というちょっとしたメモ。