Unix:在文件名中搜索和替换

Unix:在文件名中搜索和替换

使用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,但很少默认安装)。

相关内容