我有一个数字文件名的文件列表(例如#.php,##。php或者###。php),我想一次性复制/移动。
有谁知道一个ls
或grep
组合命令来完成这个目标?
我有这么多:
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
不要使用ls
或grep
。