gpt4 book ai didi

regex - 重命名树中基本名称中包含扩展名的文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:09 26 4
gpt4 key购买 nike

我在 CentOS 服务器上的一个目录(以及许多子目录)中有一堆文件,它们的扩展名不小心粘在了基本名称上,就像这样。

12345jpg

我想把它们都重命名为

12345.jpg

我已经接近这个命令,但不能完全让重命名正则表达式工作。

find . -type f ! -name "*.*" -exec rename 's/([0-9]{5})(.*)/$1.$2/'

更新:使用 sed 而不是重命名会更好吗?像这样? (目前也不起作用)

find . -type f ! -name "*.*" -exec sed -i '' s/([0-9]{5})(.*)/1.2/g {} ;

最佳答案

我不认为 rename 实用程序可以处理反向引用。

这是一个仅适用于 posix 的可移植解决方案:

find . -type f -name '[0-9][0-9][0-9][0-9][0-9]?*' \
-not -name '*.*' |while IFS= read file; do
dir="${file%/*}"
file="${file#$dir/}"
B="${file#?????}"
A="${file%$B}"
mv -i "$dir/$file" "$dir/$A.$B"
done

这使用 shell 通配符(缺少量词,因此冗余)来确保我们只重命名具有预期的五个前导数字然后至少多一个字符的文件,同时排除名称中带有点的文件。

然后它逐行循环(是的,如果您的文件名中有换行符,这会中断——不要那样做!)。我正在明确清除 $IFS,因此不会将空格解释为字段分隔符。

在 while 循环中,我修改了文件名。首先,我提取目录名称(如果没有,则为 ./;如果偏离 find . …,请小心),然后更改 $file 变量只存储文件名。然后我将 $B 分配给缺少前五个字符的文件名(find 已经要求是数字)和 $A 是前五个字符。现在我们可以使用额外的点进行重命名。

我使用 mv -i 作为安全措施。这将以交互方式询问您在这样做之前要覆盖的任何内容。

关于regex - 重命名树中基本名称中包含扩展名的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54222423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com