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}
印刷します。したがって、ここではファイル名を印刷し、現在の値です。$var
pattern
replacement
sample
$name