ループを使用して複数のファイルの名前を変更する

ループを使用して複数のファイルの名前を変更する

ループを使用していくつかのファイルの名前を変更する必要がありますが、Linux にまだ慣れていないため、うまく機能しません。名前を変更する必要があるファイルは次のとおりです。

E9-GOWN33_multiplemap.bin.10.fa  
E9-GOWN33_multiplemap.bin.16.fa  
E9-GOWN33_multiplemap.bin.21.fa  
E9-GOWN33_multiplemap.bin.7.fa

次のような短い名前に変更します。

E9.bin.10.fa
E9.bin.16.fa
E9.bin.21.fa
E9.bin.7.fa

renameスレッドで見たや他のループも使用しましたmvが、まだ動作しません。 ご意見をいただければ幸いです。 ありがとうございます!

答え1

perl(Ubuntu、Debian、その他多くのシステムではデフォルト)をお持ちの場合はrename、次のようにします。

rename -n 's/-GOWN33_multiplemap//' ./*fa

正しいファイル名が与えられた場合は、 なしで実行して-n実際に名前を変更します。

rename 's/-GOWN33_multiplemap//' ./*fa

答え2

これを試すことができます:

for f in *.fa; do 
  echo mv -- "$f" "${f%-*}.${f#*.}"
done

結果:

E9.bin.10.fa
E9.bin.16.fa
E9.bin.21.fa
E9.bin.7.fa

答え3

これらすべてのファイルが現在のディレクトリにあり、それらすべてがグロブパターンに一致し、他のファイルは一致しないと仮定します。

E9-GOWN33_multiplemap.bin.*.fa

次に、これらをループして

for name in E9-GOWN33_multiplemap.bin.*.fa; do
   # more code here
done

ループ内には、$nameこれらのファイルのいずれかの名前が入ります。

の名前が​​与えられた場合E9-GOWN33_multiplemap.bin.10.fa$name名前E9-GOWN33_multiplemapの先頭からビットを削除することができます。

${name#E9-GOWN33_multiplemap}

E9その後は、最初の文字列をその先頭に再度追加して作成するだけですE9.bin.10.fa

newname=E9${name#E9-GOWN33_multiplemap}

これでmv、古いファイル名を新しいファイル名に変更することができます。

mv "$name" "$newname"

それで、私たちは

for name in E9-GOWN33_multiplemap.bin.*.fa; do
    newname=E9${name#E9-GOWN33_multiplemap}
    mv "$name" "$newname"
done

またはもっと短い、

for name in E9-GOWN33_multiplemap.bin.*.fa; do
    mv "$name" "E9${name#E9-GOWN33_multiplemap}"
done

答え4

for f in *.fa; do mv -- "$f" "${f/-*p./.}"; done
  • 入力:
    E9-GOWN33_multiplemap.bin.7.fa
    E9-GOWN33_multiplemap.bin.10.fa
    E9-GOWN33_multiplemap.bin.16.fa
    E9-GOWN33_multiplemap.bin.21.fa
    
  • 出力:
    E9.bin.7.fa
    E9.bin.10.fa
    E9.bin.16.fa
    E9.bin.21.fa
    

このスクリプトも使用できます:

#!/bin/bash

# Set the directory path where the files are located
directory="/path/to/files"

# Loop through the files in the directory
for file in "$directory"/E9-GOWN33_multiplemap.bin.*.fa; do
    # Extract the original filename
    filename=$(basename "$file")
    
    # Extract the numeric part from the original filename
    number=$(echo "$filename" | awk -F'.' '{ print $3 }')
    
    # Create the new filename
    new_filename="E9.bin.$number.fa"
    
    # Rename the file
    mv "$file" "$directory/$new_filename"
done

このスクリプトでは、 for ループは、指定されたディレクトリ内のパターン E9-GOWN33_multiplemap.bin.*.fa に一致するファイルを反復処理します。ループ内では、basename を使用して元のファイル名が抽出されます。次に、awk を使用して数値部分が抽出されます。最後に、固定部分 (E9.bin.) と抽出された数値を組み合わせて新しいファイル名が作成されます。mv コマンドを使用して、ファイルを新しいファイル名に変更します。

関連情報