批量重命名文件

van*_*van 19 linux bash rename file-rename

我想批目录中,这样前面的数字和连字符从文件名剥离重命名多个文件.

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW
Run Code Online (Sandbox Code Playgroud)

如何使用linux命令执行此操作?

fed*_*qui 40

这应该是:

rename 's/^[0-9]*-//;' *
Run Code Online (Sandbox Code Playgroud)

它从块的开头[0-9](即数字)开始多次,然后是连字符-并从文件名中删除它.


如果rename不在您的机器中,您可以使用循环并mv:

mv "$f" "${f#[0-9]*-}"
Run Code Online (Sandbox Code Playgroud)

测试

$ ls
23-aa  hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa  hello aaa23-aa
Run Code Online (Sandbox Code Playgroud)

要么:

$ ls
23-a  aa23-a  hello
$ for f in *;
> do
>   mv "$f" "${f#[0-9]*-}"
> done
$ ls
a  aa23-a  hello
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于我的`rename`版本(util-linux-ng 2.17.2).你用的是什么版本? (2认同)

小智 19

我认为如果你执行以下命令,这个命令会更好:

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)

这里
ls* - 列出curent文件夹中的文件
sed -e - 执行表达式
p; - 打印旧文件名
s/old-name/new-name / - 生成新文件名
xargs -n2 - 处理mv
mv的 两个参数 - 获取两个参数并执行移动操作

建议: 在执行mv之前,验证你所做的是你想用echo实现的.

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo
Run Code Online (Sandbox Code Playgroud)

以下示例重命名

SCCF099_FG.gz5329223404623884757.tmp
SCCF099_FG.gz

ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)


Dav*_*her 6

如果第一个数字总是相同的长度:

for F in *new ; do
    mv $F ${F:8}
done
Run Code Online (Sandbox Code Playgroud)

${parameter:number}做了子扩张-需要字符串开始在第8字符.

在扩展中还有许多其他字符串编辑可用于处理其他情况.