使用 Bash 脚本重命名多个目录中的多个文件

使用 Bash 脚本重命名多个目录中的多个文件

我想使用 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

参考 :如何在 Unix 中使用单个命令或脚本重命名多个文件?

相关内容