我希望能够循环遍历与特定模式匹配的文件列表。我可以使用 ls 和 egrep 以及正则表达式让 unix 列出这些文件,但我找不到一种方法将其转变为迭代过程。我怀疑使用 ls 不是答案。任何帮助将不胜感激。
我当前的 ls 命令如下所示:
ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat'
我希望上面的内容能够匹配:
但不是:
谢谢,
保罗。
您可以将 (GNU)
find
与正则表达式搜索选项一起使用,而不是解析 ls
。
find . -regextype "egrep" \
-iregex '.*/MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' \
-exec [[whatever you want to do]] {} \;
其中
[[whatever you want to do]]
是您要对文件名称执行的命令。
来自手册页
-regextype type Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the command line. Currently-implemented types are emacs (this is the default),posix-awk, posix-basic, posix-egrep and posix-extended. -regex pattern File name matches regular expression pattern. This is a match on the whole path, not a search. For example, to match a file named `./fubar3', you can use the regular expression `.*bar.' or `.*b.*3', but not `f.*r3'. The regular expressions understood by find are by default Emacs Regular Expressions, but this can be changed with the -regextype option. -iregex pattern Like -regex, but the match is case insensitive.
基于 Andy K 提供的链接,我已使用以下内容根据我的匹配标准进行循环:
for i in $(ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' ); do
echo item: $i;
done
我正在寻找列表
sda*
和 sdb*
以 /dev
中的一位数字结尾,我发现 ls 在这种情况下可以自行工作:
> /dev/sd[ab][0-9]
/dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 /dev/sda5 /dev/sda6 /dev/sdb1
但是有一个限制,那就是它不喜欢
+
字符,如果我想搜索例如末尾有几个数字:
> ls /dev/sd[ab][0-9]+
ls: cannot access /dev/sd[ab][0-9]+: No such file or directory
在这里,您确实需要使用
ls | egrep ...
或 find
,如其他提到的,但由于在您的正则表达式中您没有 +
,这应该对您有用:
ls MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat