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


14

举例来说,我的工作目录中包含以下文件: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


供参考:模式匹配通配符
IGNIS

Answers:


20

您可以使用大括号扩展:

ls mjk00{25..50}.fits

必要时可以包含前导零:

ls mjk0{000..149}.fits

1
使用此语法,您还可以指定一个步进值:{25..50..2}
nobar

1

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

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

这并不是您要查找的内容,但这是glob模式提供的最接近的功能,它肯定比键入每个fileystem好。至少每个数字范围所需的模式数量受该范围的数字端点的对数限制。


1

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

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

我不知道是否可能,以及最终如何使用grep将其推广。


0

通过使用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

如果要分开括号扩展的结果,则可以使用for循环:for i in {025..050} ; do ... ; done
nobar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.