我有一个存放这些文件的目录:
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
find
的-regex
匹配整个路径,而不仅仅是文件名(我自己似乎每次使用它都会忘记这一点)。
find . -regex '.*/[0-9]+.html'
(^
和$
不是必需的,因为它总是针对整个路径进行测试。)
当你想对文件做一些事情时,使用find
也有好处,例如使用内置的-exec
, -print0
和管道到xargs -0
,甚至(使用Bash):
while IFS='' read -r -d '' file
do
# ...
done < <(find . -regex '.*/[0-9]+.html' -print0)
echo
与glob, ls|grep
等往往停止工作,当文件名包含空格(甚至换行符)(我意识到在这种情况下不会发生;这更像是为未来做准备和养成好习惯的问题。
使用扩展的glob:
$ shopt -s extglob
$ echo +([0-9]).html
1.html 22.html 333.html
启用extglob
后,+(pattern)
匹配pattern
中的一个或多个。请注意,我只是使用echo
来显示哪些文件匹配—如何使用glob取决于您想对它做什么。
要在单独的行上打印每个文件,可以使用:
printf '%sn' +([0-9]).html
每个匹配模式的文件都作为单独的参数传递给printf
,因此您不必担心文件名中的空格或其他有趣的字符。
要遍历这些文件,就像这样简单:
for file in +([0-9]).html; do
echo "$file"
done
同样,shell会处理有趣文件名的任何潜在问题,因此您不必担心。