重命名文件夹中的多个文件

时间:2019-07-02 15:28:26

标签: linux bash shell

我有以下多个文件

abcd_q1_2018.pdf
abcd_q2_2018.pdf
accc_q1_2018.pdf
accc_q2_2018.pdf
axxx_q2_2018.pdf

和一个包含

的文本文件
abcd 1111
accc 2222
axxx 3333

现在我想将上述文件重命名为

1111_q1_2018.pdf
1111_q2_2018.pdf
2222_q1_2018.pdf
2222_q2_2018.pdf
3333_q2_2018.pdf

请帮助。

2 个答案:

答案 0 :(得分:0)

您可以如下使用util-linux软件包的rename命令:

while read -r source target; do
    rename "$source" "$target" $files
done < $mapping_file

$files应该是描述您要重命名的文件的文件的全局名称或文件列表(如果所有文件都在当前目录中,则为./*.pdf),$mapping_file应该是替换清单。

read命令会将每一行解析为两个变量,分别命名为sourcetarget。我们以这种方式使用while read ...; do ...; done < file来解析文件的每一行,并使用循环主体中的那些变量作为rename实用程序的参数,该实用程序在文件名中搜索字符串并将其替换为另一个

如果您拥有perl rename实用程序而不是util-linux实用程序(请检查man rename来查找),则可以使用以下命令:

while read -r source target; do
    rename "s/$source/$target/" $files
done < $mapping_file

Here是在ideone上运行的示例,该示例使用perl重命名。

答案 1 :(得分:0)

我喜欢for循环,所以这里有一些for循环!

外循环遍历重命名映射,内循环将重命名映射应用于目录中的每个文件。

   IFS=$'\n' # So we can march through the map line-by-line 
   for key in `cat rename_map`; do 
      orig=`echo ${key} | awk '{print $1}'`
      new=`echo ${key} | awk '{print $2}'`
      for file in *_2018.pdf; do 
        new_file=`echo ${file} | sed -e "s/^${orig}/${new}/"` # ["] for variable sub
        mv ${file} ${new_file}                                # Rename it!
      done 
    done