我有以下多个文件
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
请帮助。
答案 0 :(得分:0)
您可以如下使用util-linux软件包的rename
命令:
while read -r source target; do
rename "$source" "$target" $files
done < $mapping_file
$files
应该是描述您要重命名的文件的文件的全局名称或文件列表(如果所有文件都在当前目录中,则为./*.pdf
),$mapping_file
应该是替换清单。
read
命令会将每一行解析为两个变量,分别命名为source
和target
。我们以这种方式使用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