使用 UNIX 通配符列出文件范围

使用 UNIX 通配符列出文件范围

举个例子,我的工作目录中有以下文件:mjk0001.fits、mjk0002.fits,......数值一直增加到 mjk9999.fits。

有没有办法使用 UNIX 通配符列出或操作一组连续的通配符?例如,如果我需要在 0025 到 0050 上运行一个进程,我应该使用什么格式?

我尝试了以下操作,但没有成功:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

提前感谢大家,MK

答案1

您可以使用括号扩展:

ls mjk00{25..50}.fits

如果必要的话可以包含前导零:

ls mjk0{000..149}.fits

答案2

不是直接的,但你可以使用多个 glob 模式:

ls mjk002[56789].fits mjk00[34]?.fits

它不是您正在寻找的确切内容,但它是 glob 模式提供的最接近的内容,并且肯定比键入每个文件系统要好。至少每个数值范围所需的模式数量受该范围数值端点的对数限制。

答案3

您可以将正则表达式与 grep 一起使用。我不是正则表达式专家。以下返回包含 25-50 之间的数字的模式:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

我不知道这是否可能以及最终如何用 grep 来实现这一点。

答案4

for通过使用循环,可以实现更高的可移植性或灵活性printf

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

这可以很好地处理空间,并且结果非常适合管道xargs进一步处理。

具有多个匹配的数字将导致列出所有匹配的文件。

没有匹配的数字将在 stderr 上报告错误,但会||true抑制 bash 级别的错误返回。


不过,在基本情况下,使用forprintf与更简洁的用法没有什么不同:

ls --escape mjk{0025..0050..1}* ||true

相关内容