根据扩展名选择一组文件的语法?

根据扩展名选择一组文件的语法?

我有几个以下形式的文件,

组 - 1

file1.n001
file2.n002
file3.n003
file4.n004
:
:
:
filex.nx

组 - 2

file1.ntemp
file2.nreal
:
:etc

为了.n001 to .nx使用命令仅删除具有扩展名的文件(即第一组中的文件)rm,是否有一种方法可以在简短的形式中指定所有编号的扩展名(类似于rm *.n001-x)。代替rm *.n001 *.n002 *.n003 ..... *.nx

答案1

如果x应该是一些三位数,你可以使用

rm ./*.n[0-9][0-9][0-9]

这将匹配任何三位数后缀,并且应该在标准 shell 中工作,并且据我测试,也可以在 tcsh 中工作。

在 zsh 中,你可以使用

rm ./*.n<1-999>

它实际上着眼于数字,而不仅仅是字符序列,因此可以更好地控制数字范围。但请注意,它忽略前导零,因此也将匹配例如foo.n12

当然,如果x是文字x,那么您必须./*.nx单独添加到命令行。或者./*.n[a-x]。或者./*.n?。或者无论你需要什么。

答案2

x 是否表示零填充的三位数数字(file.n089、file.n678)或字母表(file.na、file.nb、file.nx、file.ny)。如果是第一个,那就超级简单了。假设您使用的是 bash 4.1.2 或更高版本(我不知道从什么时候开始支持它,但它可以在 4.1.2 中使用)。

rm ./file*.n{001..x} 

对于 {001..x} 中的 i; do rm file'$i' 它将删除所有以零填充的三位数结尾的文件。将 x 替换为最后一个数字。但它也匹配 file2.n003。
如果 x 表示字母表,那么也执行此操作

rm ./file*.n{a..x}

编辑: 对于tcsh,它也不匹配 file4.n003 这样的名称

foreach i ( `seq 1 x` ) 
rm file$i.n`printf "%0yd\n" $i`
end

将 x 更改为最高值,将 y 更改为最高位数。速度有点慢,因为它调用了rmx 次。通过将文件名附加到字符串中并将字符串传递到rm.我也不知道如何在一行中编写 tcsh 脚本。

相关内容