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

Per*_*seP 2 bash numbers ls file find

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

1.html 22.html 333.html zxc.html
Run Code Online (Sandbox Code Playgroud)

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

1.html 22.html 333.html
Run Code Online (Sandbox Code Playgroud)

我认为这会奏效

find . -regex '^[0-9]+\.html'
Run Code Online (Sandbox Code Playgroud)

要么

ls -al | grep -E '^[0-9]+\.html$'
Run Code Online (Sandbox Code Playgroud)

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

Bif*_*fen 8

find-regex与整个路径的匹配,而不仅仅是文件名(我自己似乎每次使用它时都会忘记这一次).

因此,您可以使用:

find . -regex '.*/[0-9]+\.html'
Run Code Online (Sandbox Code Playgroud)

(^并且$没有必要,因为它总是在整个路径上进行测试.)

find当你想对文件做一些事情时,使用也有好处,例如使用内置-exec,-print0管道xargs -0甚至(甚至使用Bash):

while IFS='' read -r -d '' file
do
  # ...
done < <(find . -regex '.*/[0-9]+\.html' -print0)
Run Code Online (Sandbox Code Playgroud)

echols|grep当文件名包含空格(甚至是换行符)时,使用glob 等等往往会停止工作(我意识到在这种情况下不会发生这种情况;更多的是未来打样和养成良好习惯的问题).


Tom*_*ech 5

使用扩展的glob:

$ shopt -s extglob
$ echo +([0-9]).html
1.html 22.html 333.html
Run Code Online (Sandbox Code Playgroud)

extglob启用,+(pattern)相匹配的一种或多种pattern。请注意,我只是echo用来显示匹配的文件-如何使用glob取决于您要如何处理。

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

printf '%s\n' +([0-9]).html
Run Code Online (Sandbox Code Playgroud)

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

要遍历这些文件,它很简单:

for file in +([0-9]).html; do 
    echo "$file"
done
Run Code Online (Sandbox Code Playgroud)

同样,shell会解决有趣的文件名所带来的任何潜在问题,因此您不必担心。