我想使用 Bash 脚本重命名多个目录中的多个文件。我有 772 个这样的目录,即从 Nishi_001 到 Nishi_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
您需要迭代映射文件,将目录和名称模式读取到两个变量中,并在命令中使用它们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="="
告诉您的 shell 将输入拆分=
,因此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
。
答案2
#!/bin/bash
for file in sample_00*
do
replace_name=$(echo $file | sed "s/sample/130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1/g" | cat )
mv $file $replace_name
done