如何重命名目录中的文件,同时保持部分名称不变?

如何重命名目录中的文件,同时保持部分名称不变?

我有多个文件(约 1000 个),其名称如下:

abcdefg123456.xyz
abcdefg123457.xyz
abcdefg123458.xyz
abcdefg123459.xyz

有些文件的名称后面有 4 个额外的随机数字和字母(任意顺序)。这些可能是重复的,但并非总是如此,所以我需要将它们更改为原始格式以验证它们是否重复。它们的格式如下:

abcdefg123456a789.xyz
abcdefg123457b987.xyz
abcdefg123458c879.xyz
abcdefg123459d897.xyz

有时,也会出现错误的扩展名,

abcdefg123456.xyzedf
abcdefg123456.xyzfed

我想将这些文件重命名为原始格式 abcdefg 后跟原始 6 位数字 - 即删除尾随的 4 位随机数字和字母,并删除尾随的扩展名 .xyz 到目前为止我所拥有的是:

rename -n "s/[a-z][0-9]{6}.xyz/.xyz/g"  *

但它似乎不起作用。出于某种原因,输出是:

abcdef.xyz (no numbers)

编辑:我有点纠结于该选择哪个答案,因为两者都有助于找到解决方案。我选择了 stuts,因为他也帮助解决了问题的第二部分。但非常感谢您的帮助,Mark Perryman - 当然还有评论者。

答案1

解决方案

要删除所有文件句号前的 4 个数字/字母,可以使用以下循环:

for file in *.xyz ; do
    NEWFILE=$(echo "$file" |sed -re 's/[a-z|0-9][a-z|0-9][a-z|0-9][a-z|0-9](\.)/\./g')
    mv -v $file $NEWFILE
done

解释

for file in *.xyz ; do

循环遍历每个带有 .xyz 扩展名的文件

NEWFILE=$(echo "$file" |sed -re 's/[a-z|0-9][a-z|0-9][a-z|0-9][a-z|0-9](\.)/\./g')

创建一个名为 的变量NEWFILE,其中包含删除匹配的模式[a-z|0-9][a-z|0-9][a-z|0-9][a-z|0-9](4 个数字或字母的混合)后跟句号((\.))的文件名。

mv -v $file $NEWFILE

将文件移动到新名称,将以-v以下格式打印移动过程

`abcdefg123456a789.xyz` -> `abcdefg123456.xyz`

目前这不包括扩展的修复,但可以使用与上述类似的解决方案,但使用 sed 命令sed 's/\.xyz.*/\.xyz/g'

答案2

尝试

rename -n -f 's/([a-z]*[0-9]{6})[a-z0-9]{0,4}(\.xyz).*/$1$2/g'  *

rename这适用于随 debian 和 ubuntu 发布的版本(请参阅手册页http://www.computerhope.com/unix/rename.htm

这将覆盖具有重复名称的文件。

为什么这样做有效

  • ([a-z]*[0-9]{6})$1是捕获的 abcdefg123456,可以在替换中引用。
  • (\.xyz)$2是在替换中捕获并引用的扩展。
  • 所有其他内容[a-z0-9]{0,4}(最多 4 个字母/数字)和.*(扩展名后的任何内容)都会被匹配,然后在替换中被忽略。

奖金 要删除所有仍不符合您的模式的文件(例如,如果您没有使用上面的强制选项),请使用find列出它们并删除它们。(无需运行-exec rm {}即可进行试运行。)

find . -regextype posix-egrep -regex '.*/[a-z]*[0-9]{6}[a-z0-9]{4}\.xyz.*|[a-z]*[0-9]{6}\.xyz.*' -exec rm {}

相关内容