我有一个带有数字文件名的文件列表(例如#.php,##。php或###。php),我想一举复制/移动。
有没有人知道ls
或grep
组合命令来实现这一目标?
我确实有这么多:
ls -al | grep "[0-9].php"
答案 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
请勿使用ls
或grep
。
答案 4 :(得分:-2)
列出文件时可以使用正则表达式:
ls [0-9]*
对于上述问题,这是一种简单而简约的方法,但我认为更好的解决方案是
ls -al | grep -E '^[0-9]+\.php$'
正如UncleZeiv解释below。