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

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

有谁知道一个lsgrep组合命令来完成这个目标?

我有这么多:

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

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

 ls [0-9]* 

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

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

正如UncleZeiv 在下面解释的那样 。

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

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

这将找到文件,如:

 123.php 9.php 

但不是

 a.php 2b.php c3.php 

修改它是这样的:

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

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

+要求必须出现至少一个前一组的事件。

\. 逃避点,否则它意味着“任何字符”。

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

单引号,以防止变量扩展(它会抱怨因为$ )。

使用find:

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

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

mv命令中的{}技巧被find的文件名替换。

使用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