举个例子,我的工作目录中有以下文件: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 级别的错误返回。
不过,在基本情况下,使用for
和printf
与更简洁的用法没有什么不同:
ls --escape mjk{0025..0050..1}* ||true