我有一个包含数字文件名(例如#.php,##。php或###。php)的文件列表,我想一次性复制/移动。仅列出目录中的数字文件名
有谁知道ls
或grep
组合命令来完成这个目标吗?
我有这么多:
ls -al | grep "[0-9].php"
我有一个包含数字文件名(例如#.php,##。php或###。php)的文件列表,我想一次性复制/移动。仅列出目录中的数字文件名
有谁知道ls
或grep
组合命令来完成这个目标吗?
我有这么多:
ls -al | grep "[0-9].php"
列出文件时,您可以使用正则表达式:
ls [0-9]*
这是在上述问题的一个简单,简约的做法,但我认为一个更好的解决方案是
ls -al | grep -E '^[0-9]+\.php$'
为UncleZeiv解释below。
修改这样的:
ls -al | grep -E '^[0-9]+\.php$'
-E
激活扩展正则表达式。
+
要求至少出现前一组的出现。
\.
转义点否则它表示“任何字符”。
^
和$
匹配整个文件名而不仅仅是一个部分。
单引号以防止可变扩展(它会因为$
而发生抱怨)。
不要使用'ls'在脚本中,它仅用于交互式使用。 – Philipp 2010-06-30 17:04:39
@Philipp:没有人提到脚本。 – Troubadour 2010-06-30 17:33:08
@Troubadour:进入'grep'的管道使它成为一个“脚本”。 – 2010-06-30 17:49:43
使用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
。
在bash中,你可以使用扩展模式匹配:
shopt -s extglob
ls -l +([0-9]).php
这将找到的文件,如:
123.php
9.php
但不
a.php
2b.php
c3.php
这当然取决于壳?例如'bash'不会将其视为正则表达式。试试看,你会看到它匹配_any_文件,其名称以数字开头。 – Troubadour 2010-06-30 16:42:30
其实我正在运行bash,它工作完美。这太简单了。感谢您的解决方案。我用cp [0-9] * – gurun8 2010-06-30 16:54:07
@ gurun8:你很幸运,你的名字中没有任何非数字字符的文件。 – Troubadour 2010-06-30 16:58:34