我有多个文件(约 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 {}