web-dev-qa-db-ja.com

複数のファイルの名前を変更しますが、Bashのファイル名の一部のみを変更します

ファイルなどの名前を変更する方法は知っていますが、これに問題があります。

名前を変更する必要があるのはtest-this forループ内。

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 
45
user3115029

これらすべてのファイルが1つのフォルダーにあり、Linuxを使用している場合は、次を使用できます。

rename 's/test-this/REPLACESTRING/g' *

結果は次のようになります。

REPLACESTRING.ext
REPLACESTRING.volume001+02.ext
REPLACESTRING.volume002+04.ext
...

renameは、最初の引数としてコマンドを取ることができます。このコマンドは、4つの部分で構成されています。

  1. s:文字列を別の文字列に置き換えるフラグ、
  2. test-this:置換する文字列、
  3. REPLACESTRING:検索文字列を置換する文字列、および
  4. g:検索文字列のすべての一致が置き換えられることを示すフラグ。つまり、ファイル名がtest-this-abc-test-this.extの場合、結果はREPLACESTRING-abc-REPLACESTRING.extになります。

フラグの詳細な説明については、man sedを参照してください。

101
Tim Zimmermann

以下に示すようにrenameを使用します。

rename test-this foo test-this*

これにより、test-thisファイル名にfooを含む。

renameがない場合は、以下に示すようにforループを使用します。

for i in test-this*
do
    mv "$i" "${i/test-this/foo}"
done
44
dogbane

関数

私はOSXを使用していますが、bashにはrenameが組み込み関数として付属していません。最初の引数を受け取る.bash_profileで関数を作成します。これは、1回だけ一致する必要があるファイル内のパターンであり、その後に何が来るかを気にせず、引数2のテキストに置き換えます。

rename() {
    for i in $1*
    do
        mv "$i" "${i/$1/$2}"
    done
}

入力ファイル

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 

コマンド

rename test-this hello-there

出力

hello-there.ext
hello-there.volume001+02.ext
hello-there.volume002+04.ext 
hello-there.volume003+08.ext 
hello-there.volume004+16.ext 
hello-there.volume005+32.ext 
hello-there.volume006+64.ext 
hello-there.volume007+78.ext 
10
Joe Flack