我有一个包含这些文件的目录:
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
答案 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会处理有趣文件名的任何潜在问题,因此您不必担心它。