仅列出目录中的数字文件名

时间:2010-06-30 16:30:21

标签: linux bash

我有一个带有数字文件名的文件列表(例如#.php,##。php或###。php),我想一举复制/移动。

有没有人知道lsgrep组合命令来实现这一目标?

我确实有这么多:

ls -al | grep "[0-9].php"

5 个答案:

答案 0 :(得分:8)

在Bash中,您可以使用扩展模式匹配:

shopt -s extglob
ls -l +([0-9]).php

将找到如下文件:

123.php
9.php

但不是

a.php
2b.php
c3.php

答案 1 :(得分:7)

像这样修改:

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

-E激活扩展的正则表达式。

+要求必须至少出现前一组的一次。

\.转义点,否则表示“任何角色。”

^$匹配整个文件名,而不仅仅是一个部分。

单引号以防止变量扩展(由于$会抱怨)。

答案 2 :(得分:4)

使用find:

$ find . -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'

请注意,-regex参数执行搜索,而不是匹配,这就是^将其锚定到开头的原因。这也假定文件与运行命令时所在的目录(。)位于同一目录中。

{}命令中的mv欺骗被find替换为找到的文件名。

答案 3 :(得分:2)

使用find(可能与-XXXdepth选项结合使用):

find . -mindepth 1 -maxdepth 1 -regex '^[0-9]+\.php' -exec mv '{}' dest/ ';'

或者使用内置的正则表达式功能:

pattern='^[0-9]+\.php$'
for file in *.php
do
    [[ $file =~ $pattern ]] && echo "$file"
done

请勿使用lsgrep

答案 4 :(得分:-2)

列出文件时可以使用正则表达式:

ls [0-9]*

对于上述问题,这是一种简单而简约的方法,但我认为更好的解决方案是

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

正如UncleZeiv解释below