質問: CentOSを使っているのですが、bashのコマンドラインで `aaa1.txt` から `aaa5.txt` まで連続した番号のものを圧縮したい場合には、 ``` $ gzip aaa[1-5].txt ``` とすればできますが、たぶんこれは `gzip` が正規表現に対応しているからだろうと思います。 また、よく `ls` や `grep` などでアスタリスクを使ったりするのですが、これもそうだろうと思います。`sed` では後方参照ができますが、一方で ``` $ mv aaa¥([1-5]¥).txt bbb¥1.txt ``` なんてやってもうまくいきません。 シェルスクリプトを書くまでもない処理で、こういう後方参照をする方法というのはあるのでしょうか?
回答: Unix/Linux (というか bash) ではコマンドラインの展開を行うのは bash の仕事ということになっています。 $ gzip aaa[1-5].txt と入力したらこのファイル名展開を行うのは bash であり、起動されるコマンドは $ gzip aaa1.txt aaa2.txt aaa3.txt aaa4.txt aaa5.txt となります。 gzip が展開を行っているわけではありません。 一方で mv の仕様として mv file1 file2 (file1 を file2 に改名する:このときは引数は2個でなければならない) mv file1 directory (file1 を directory/file1 に改名する) mv file1 file2 ... directory (引数が3つ以上のとき、最後の引数はディレクトリを指定する必要がある) なので、提示の mv は動かないのが当然ということになります。 提示 mv で何がしたいのか微妙につかめませんが aaa/aaa*.txt を bbb ディレクトリに移す (aaa*.txt のまま) のなら `mv aaa/aaa*.txt bbb` でしょうし bbb*.txt に名前を変更しながら bbb ディレクトリに移すのなら ``` for i in aaa/aaa*.txt; do mv $i `sed s/aaa/bbb/g`; done ``` となるでしょう。