23

我想批量重命名目录中的多个文件,以便从文件名中删除前面的数字和连字符。

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW

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

4

9 回答 9

42

这应该使它:

rename 's/^[0-9]*-//;' *

它从开头[0-9]多次获取块(即数字),然后是连字符-并将其从文件名中删除。


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

mv "$f" "${f#[0-9]*-}"

测试

$ ls
23-aa  hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa  hello aaa23-aa

或者:

$ ls
23-a  aa23-a  hello
$ for f in *;
> do
>   mv "$f" "${f#[0-9]*-}"
> done
$ ls
a  aa23-a  hello
于 2013-09-11T14:01:44.667 回答
20

如果您执行以下命令,我认为此命令会更好:

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv

这里
ls * - 列出当前文件夹中的文件
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

以下示例重命名

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
于 2014-05-19T09:03:17.813 回答
6

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

for F in *new ; do
    mv $F ${F:8}
done

${parameter:number}进行子字符串扩展 - 从第 8 个字符开始获取字符串。

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

于 2013-09-11T14:03:11.030 回答
3

使用重命名器(Windows、Mac 和 Linux 友好):

$ renamer --find '/\d+-(.*)/' --replace '$1' *

这将从当前目录中所有文件的开头删除所有数字和第一个连字符。

于 2013-09-25T08:55:49.603 回答
2

这可能看起来有点复杂,但它非常有效,并且在 *nix 和 OSX 系统上都运行良好。它还递归地重命名当前目录以及任何子目录中的文件:

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
cp temp1 temp2 && \
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
paste temp1 temp2 > temp3 && \
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
sh ./temp3 && \
rm temp1 temp2 temp3

以下是刚刚发生的事情的细分:

第一行表示查找 ( find) 所有文件,从当前目录 ( .) 中的文件开始,其名称与-regex“7 个数字,后跟一个破折号,后跟 0 个或多个字符” ( '.*/[0-9]\{7\}[-].*') 的模式 ( ) 匹配,然后写入这些文件名和它们各自的路径 ( -print) 到名为temp1 ( > temp1) 的文件。请注意,该-print指令在大多数情况下可能不是必需的,但它不应该伤害任何东西。

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \

然后,将temp1cp的内容复制 ( )到名为temp2的文件中。

cp temp1 temp2 && \

接下来,使用vi文本编辑器打开文件temp2并给 vi 两个命令(用于表示每个新命令):-c

  1. 命令#1:
    • 在temp2 ( ) 的每一行中搜索:g我们在上面搜索的相同模式,但这次使用括号 ( \([0-9]\{7\}[-]\)\(.*\)) 对结果进行分组。
    • 对于每个匹配行,将光标移动到找到匹配项的位置,并仅将整个匹配项替换为匹配模式的第二组 ( \2)。
  2. 命令#2:
    • 保存对temp2所做的更改并关闭文件 ( :x)。

结果是这样的:

 vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \

现在,将temp1中的行与temp2 ( paste) 中的行连接起来,并将每个新组合的行写入一个名为temp3 ( > temp3) 的文件中。

paste temp1 temp2 > temp3 && \

接下来,再次运行vi,执行与上述相同的步骤,只是这次^在文件temp3中搜索每一行的开头 ( ) 并在其后添加mv和一个空格 ( mv)。

vi -c ":g/^/s//mv /" -c ":x" temp3 && \

然后,将temp3 ( ./temp3) 的内容作为 shell 脚本 ( sh) 执行。

sh ./temp3 && \

最后,删除(rm)我们在整个过程中创建的每个临时文件。

rm temp1 temp2 temp3
于 2015-05-25T00:21:36.723 回答
1

还有一个方便的 GUI 工具pyRenamer https://wiki.ubuntuusers.de/pyRenamer/

于 2017-08-10T18:43:31.903 回答
1

vimv允许您使用 Vim 的文本编辑功能重命名多个文件。

输入 vimv 会打开一个列出所有文件的 Vim 窗口,您可以进行模式匹配、视觉选择等来编辑名称。退出 Vim 后,文件将被重命名。

自述文件中的截屏视频显示了它如何解决原始发帖人的问题。

[免责声明:我是该工具的作者]

于 2017-08-13T04:37:12.727 回答
0

你可以使用这个工具:rnm

代码做你想做的事:

rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'

-fo仅用于文件模式
-dp是目录的深度(-1意味着无限深度)。
-rs是替换字符串。\d+-正则表达式被替换为空字符串。
-ss是搜索字符串,它使用正则表达式搜索文件^\d+-。(虽然它可以省略,一些无害的错误信息会打印在屏幕上)。

于 2015-10-08T20:19:52.190 回答
0

我真的很喜欢“重命名 *.mp3 *.mp4”。

但是其他答案都没有给我。所以我写了一个haskell程序来做到这一点。

https://hackage.haskell.org/package/batch-rename

有了这个你可以这样做:batch_rename "DCIM*.jpg" "*.png"

于 2016-09-14T11:21:34.597 回答