列出仅在名称中包含数字的文件

时间:2015-05-29 10:23:28

标签: bash file numbers find ls

我有一个包含这些文件的目录:

1.html 22.html 333.html zxc.html

我想获得一个只有名字中的数字的html文件列表:

1.html 22.html 333.html

我认为这会起作用

find . -regex '^[0-9]+\.html'

ls -al | grep -E '^[0-9]+\.html$'

但我一无所获。我的想法是获取名称中只有数字的html文件并将它们传递给sed进行替换。我使用linux和bash

2 个答案:

答案 0 :(得分:6)

find的{​​{1}}与整个路径匹配,而不仅仅是文件名(我自己似乎每次使用时都会忘记这一次)。

因此,您可以使用:

-regex

find . -regex '.*/[0-9]+\.html' ^不是必需的,因为它总是针对整个路径进行测试。)

当您想对文件执行某些操作时,使用$也很有用,例如使用内置的find-exec和管道到-print0甚至(使用Bash):

xargs -0
当文件名包含空格(甚至是换行符)时,带有glob,while IFS='' read -r -d '' file do # ... done < <(find . -regex '.*/[0-9]+\.html' -print0) 等的

echo往往会停止工作(我知道在这种情况下不会发生这种情况;这更像是一个问题面向未来,养成良好习惯。)

答案 1 :(得分:4)

使用扩展的glob:

$ shopt -s extglob
$ echo +([0-9]).html
1.html 22.html 333.html

启用extglob后,+(pattern)会与pattern中的一个或多个匹配。请注意,我只是使用echo来显示哪些文件匹配 - 你如何使用glob取决于你想用它做什么。

要在单独的行上打印每个文件,您可以使用:

printf '%s\n' +([0-9]).html

与模式匹配的每个文件都作为单独的参数传递给printf,因此您不必担心文件名中的空格或其他有趣字符等内容。

要迭代这些文件,它就像:

一样简单
for file in +([0-9]).html; do 
    echo "$file"
done

同样,shell会处理有趣文件名的任何潜在问题,因此您不必担心它。