【问题标题】:List files that only have number in names列出名称中只有数字的文件
【发布时间】:2015-08-12 04:15:54
【问题描述】:

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

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'
  • @Biffen 不应该这样工作ls | grep -E '^[0-9]+\.html$' 吗?但是您的查找解决方案有效
  • 取决于ls 打印的内容,这就是您shouldn't parse ls 的原因。 command ls | grep -E '^[0-9]+\.html$' 恰好为我工作,但我仍然不会依赖它。
  • @Biffen 如果您将评论转换为答案,所有人都可以投票
  • 我发现ls | grep -E '^[0-9]+\.html$' 也可以,但不是第一次尝试,我觉得是因为我的远程shell

标签: bash shell file numbers find


【解决方案1】:

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 等往往会在文件名包含空格(甚至换行符)时停止工作(我意识到在这种情况下不会发生这种情况;这更多的是面向未来的问题并养成良好的习惯)。

【讨论】:

    【解决方案2】:

    使用扩展的 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 会处理有趣的文件名的任何潜在问题,因此您不必担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多