使用sed
,我可以搜索和替换文件中的文本。有没有办法可以搜索和替换文件名?例如,如果我在一个文件夹中有一堆文件,其名称如下:
- foo01
- foo02
- 酒吧001
- 酒吧002
我想快速重命名所有以 foo 开头的数字,使它们有 3 位数字而不是 2 位。
答案1
#!/bin/bash
shopt -s nullglob
for file in foo*
do
filename=${file%%[0-9]*}
num=${file##*[^0-9]}
newnum=$(printf "%03d" $num)
newfile=${filename}${newnum}
mv "$file" "$newfile"
done
答案2
如果你使用麦金塔,有一个名为重命名工具。我没用过,但是从描述来看,它可能就是你想要的。
renameutils - 使重命名文件更容易的工具描述 ¶
renameutils 包含 5 个程序:qmv、qcp、imv、icp 和 deurlname
qmv 和 qcp 使用文本编辑器的帮助来创建在保存文件时执行的“计划”,非常适合批量移动
imv 和 icp 是支持 GNU readline 的交互式程序
deurlname 从文件名中删除 URL 编码的字符
更多信息请参阅项目主页 http://www.nongnu.org/renameutils/
答案3
您的系统上可能已经有一个名为rename
或 的Perl 脚本prename
。
rename 's/\d\d$/0$&/' foo*
如果多次运行该命令,它将继续插入零。为了防止这种情况,此版本仅重命名以两位数字结尾的文件(前面至少有一个非数字):
rename 's/([^\d])(\d\d)$/${1}0$2/' foo*
s///
是替代命令\d
代表数字$&
在第一个例子中代表前两个斜杠之间匹配的所有内容(在本例中为两位数字)[^\d]
代表所有[]
不是 ( )^
数字 ( ) 的字符 (\d
)${1}
代表第一组括号中匹配的内容(非数字),括号将“1”与文字“0”区分开来$2
代表第二组括号中匹配的内容(两位数字),这里不需要括号,但你可以使用它们
答案4
看一看mmv
(应该适用于所有类型的 Linux,但很少默认安装)。