一、基本概念
在shell中使用mv命令可以用来对单个文件进行修改操作,但是当我们需要批量对文件进行修改时就需要使用循环结构和正则表达式等来实现。在这里我们先来介绍一下基本的概念及命令。
1. mv命令
mv [option] source_file target_file
该命令用来修改文件名或文件所在路径,其中option可以包括四个参数,分别为-i, -f, -u和-t。-i表示交互式,-f表示不提示直接覆盖,-u表示只有源文件比目标文件新或目标文件不存在时才会修改,-t表示指定目标文件夹。
2. for循环
for var in $list #注意空格
do
command #在此处执行指定操作
done
for循环常用来对列表中的每个元素进行操作,其中var为变量名,$list表示需要操作的列表,command表示需要执行的操作。
3. 正则表达式
正则表达式是一种用来匹配文本的表达式,它包含了特定的字符和文本结构,常用的有^, $, ., *, [], {}等符号。例如 ^ 和 $ 用来匹配字符串的起始和结束位置,. 表示任意一个字符,* 表示匹配前面的字符 0 次或多次,[] 表示匹配括号中的任意一个字符,{} 表示匹配前面的字符固定次数。
二、批量修改文件名的常用方法
1. 根据文件名中的某些字符进行修改
对于需要根据文件名中的某些字符进行修改的情况,我们可以使用for循环和正则表达式来实现:
#!/bin/bash
for file in *.txt
do
mv $file ${file/txt/md} #把txt替换为md
done
上述代码表示将当前文件夹中所有txt文件的后缀名修改为md。
2. 在文件名中添加字符
有时我们需要在文件名中添加一些特定的字符,例如在文件名前后添加字符串或者添加日期信息:
#!/bin/bash
for file in *.txt
do
mv $file $(date +%Y%m%d)_$file #在文件名前面添加当前日期
done
上述代码表示将当前文件夹下所有txt文件的文件名前面添加当前日期。
3. 数字序列或随机数
有时我们需要给文件名添加数字序列或者随机数,这时我们可以使用seq或者$RANDOM变量实现:
#!/bin/bash
num=0
for file in *.png
do
num=$(($num+1))
mv $file image_${num}.png #给文件名添加数字序列
done
上述代码表示将当前文件夹下所有png文件的文件名修改为image_1.png, image_2.png等。
#!/bin/bash
for file in *.png
do
mv $file image_${RANDOM}.png #给文件名添加随机数
done
上述代码表示将当前文件夹下所有png文件的文件名修改为image_4235.png, image_213.png等随机数。
三、实用技巧
1. 去除文件名中的特定字符
有时我们需要去除文件名中的某些字符,例如特定的前缀或后缀:
#!/bin/bash
for file in *-user.txt
do
mv $file ${file/-user/} #去除特定的后缀
done
上述代码表示将当前文件夹下所有以-user结尾的文件名中的-user去掉。
2. 批量修改文件夹中的文件名
有时我们需要对某个文件夹中的文件名进行批量修改,这时我们只需要在mv命令中加上目标的文件夹路径:
#!/bin/bash
for file in ~/Documents/*.doc
do
mv $file ~/Documents/new_files/${file##*/} #修改文件夹路径并保留原文件名
done
上述代码表示将Documents文件夹下所有doc文件的文件名移到Documents/new_files文件夹下。
3. 对子文件夹中的文件进行批量修改
有时我们需要对某个文件夹中的子文件夹中的所有文件进行修改操作,这时我们可以使用递归结构来实现:
#!/bin/bash
function renameFiles() {
for file in $1/* #递归读取子文件夹
do
if [ -d "$file" ]; then #判断是否为目录
renameFiles "$file"
else
mv "$file" "${file/mp4/flv}" #修改文件名
fi
done
}
renameFiles ~/Movies #从Movies文件夹开始递归
上述代码表示将Movies文件夹及其子文件夹下所有mp4文件的文件名修改为flv。
四、总结
批量修改文件名在我们日常的工作中经常使用,使用shell脚本可以高效地实现这些操作。本文针对常见的批量操作情形进行了详细的介绍,并给出了对应的代码示例。通过学习本文,你可以更加熟练地运用shell脚本进行文件名的批量修改操作。