Bashスクリプトを使用して複数のディレクトリの複数のファイル名を変更する

Bashスクリプトを使用して複数のディレクトリの複数のファイル名を変更する

Bashスクリプトを使用して、複数のディレクトリにある複数のファイルの名前を変更したいと思います。 Nishi_001からNishi_772までの772のディレクトリがあります。各ディレクトリのファイル数は異なりますが、以下に示すように、ファイル名はすべてのディレクトリで同様に指定されます。

sample_001samout
sample_002samout
sample_003samout
sample_004samout
.
.
sample_00Nsamout  N=maximum 18

各ディレクトリのファイル名を各ディレクトリに固有の特定の名前に変更したいと思います。たとえば Nishi_001 の場合、次のファイルが含まれます。

sample_001samout
sample_002samout
sample_003samout

次の形式に名前を変更します。

130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_001samout
130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_002samout
130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_003samout

772個のディレクトリはそれぞれ異なる名前を持ちます。次の新しい名前のリストを含むファイルがあります。

Nishi_003="130906_Hiseq3B_l7_003_Dr_Nishikawa_ATGCCTAA_L007_R1"
Nishi_004="130906_Hiseq3B_l7_004_Dr_Nishikawa_AGTGGTCA_L007_R1"
Nishi_005="130906_Hiseq3B_l7_005_Dr_Nishikawa_ACCACTGT_L007_R1"

特定のディレクトリ内のすべてのファイル名は、ファイルソースを識別するために同じ名前に変更されます。この新しい名前は、特定のディレクトリに含まれるすべてのファイルの「sample」という句を置き換えます。

たとえば、Nishi_001ディレクトリ内のすべてのファイルの「sample」という句を次のように置き換える必要があります。

"130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1" 

Nishi_001 ディレクトリの具体的な新しい名前です。

ベストアンサー1

マップファイルを繰り返し、ディレクトリと名前パターンを2つの変数として読み込み、コマンドに使用する必要がありますmv

sed 's/"//g' map.txt | 
    while IFS="=" read dir name; do 
        for file in "$dir"/*; do 
            mv "$file" "${file/sample/$name}"
        done
    done 

説明する

  • sed 's/"//g' map.txt:ターゲット名の周りの引用符を削除します。
  • while IFS="=" read dir name; do$IFS="="シェルに入力を分割するように指示=し、read dir nameターゲットディレクトリを変数として読み込み、$dir名前をから読み込みます$name。これはコマンドの出力で実行されるため、引用符がないようですsed$name
  • for file in "$dir"/*; do:それぞれ$dir
  • mv "$file" "${file/sample/$name}":構文は、文字列が置き換えられる場所を${var/pattern/replacement}印刷します。したがって、ここではファイル名を印刷し、現在の値です。$varpatternreplacementsample$name

おすすめ記事