8386


CentOSを使っているのですが、bashのコマンドラインで `aaa1.txt` から `aaa5.txt` まで連続した番号のものを圧縮したい場合には、

[code]

    $ gzip aaa[1-5].txt
    
[/code]

とすればできますが、たぶんこれは `gzip` が正規表現に対応しているからだろうと思います。

また、よく `ls` や `grep` などでアスタリスクを使ったりするのですが、これもそうだろうと思います。`sed` では後方参照ができますが、一方で

[code]

    $ mv aaa￥([1-5]￥).txt bbb￥1.txt
    
[/code]

なんてやってもうまくいきません。

シェルスクリプトを書くまでもない処理で、こういう後方参照をする方法というのはあるのでしょうか？


CC BY-SA 4.0
2015-03-25T10:55:49.273
8379
2020-09-01T16:37:45.847
2020-09-01T16:37:45.847
3060
5835
question
bash centos 正規表現
bashで正規表現の後方参照


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 に改名する：このときは引数は２個でなければならない)  
mv file1 directory (file1 を directory/file1 に改名する)  
mv file1 file2 ... directory (引数が３つ以上のとき、最後の引数はディレクトリを指定する必要がある)  
なので、提示の mv は動かないのが当然ということになります。

提示 mv で何がしたいのか微妙につかめませんが  
aaa/aaa*.txt を bbb ディレクトリに移す (aaa*.txt のまま) のなら  
`mv aaa/aaa*.txt bbb` でしょうし

bbb*.txt に名前を変更しながら bbb ディレクトリに移すのなら

[code]

    for i in aaa/aaa*.txt; do mv $i `sed s/aaa/bbb/g`; done
    
[/code]

となるでしょう。


CC BY-SA 3.0
2015-03-25T11:13:13.063
8381
2015-03-25T11:13:13.063
8589
8379
answer


一般解はさておき、例に挙げられたファイル名変更については、CentOSの最小構成でもrenameコマンドが使えるかと思います。

[code]

    $ rename aaa bbb aaa[1-5].txt
    
[/code]

なお、renameコマンドは、Red
Hat系（CentOSなどを含む）とDebian系（Ubuntuなどを含む）とで、使い方の異なるまったく別のコマンドが入っているのはご注意。


CC BY-SA 3.0
2015-03-25T13:55:08.507
8386
2015-03-25T13:55:08.507
4010
8379
answer