2010-06-30 62 views
9

我有一个包含数字文件名(例如#.php,##。php或###。php)的文件列表,我想一次性复制/移动。仅列出目录中的数字文件名

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

我有这么多:

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

回答

-4

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

ls [0-9]* 

这是在上述问题的一个简单,简约的做法,但我认为一个更好的解决方案是

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

为UncleZeiv解释below

+2

这当然取决于壳?例如'bash'不会将其视为正则表达式。试试看,你会看到它匹配_any_文件,其名称以数字开头。 – Troubadour 2010-06-30 16:42:30

+0

其实我正在运行bash,它工作完美。这太简单了。感谢您的解决方案。我用cp [0-9] * – gurun8 2010-06-30 16:54:07

+0

@ gurun8:你很幸运,你的名字中没有任何非数字字符的文件。 – Troubadour 2010-06-30 16:58:34

6

修改这样的:

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

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

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

\.转义点否则它表示“任何字符”。

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

单引号以防止可变扩展(它会因为$而发生抱怨)。

+2

不要使用'ls'在脚本中,它仅用于交互式使用。 – Philipp 2010-06-30 17:04:39

+0

@Philipp:没有人提到脚本。 – Troubadour 2010-06-30 17:33:08

+1

@Troubadour:进入'grep'的管道使它成为一个“脚本”。 – 2010-06-30 17:49:43

4

使用find:

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

注意,-regex参数做了搜索,不匹配,这就是为什么^有没有将它锚定到开始。这也假定文件与运行命令时所在的目录位于同一个目录(。)中。

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

+1

+1使用查找 – zdav 2010-06-30 16:41:28

+2

但没有+1这样使用它。这将打破文件名与空格或换行符。而是使用'find。 -regex'^ [0-9] + \。php'-exec mv'{}'dest /';''或者'xargs -0'。 – Philipp 2010-06-30 17:04:10

+0

@菲利普:谢谢,这更强大。我印象中原始海报的文件名集不包含空格,但当然安全性更好。 – unwind 2010-06-30 17:37:28

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

7

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

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

这将找到的文件,如:

123.php 
9.php 

但不

a.php 
2b.php 
c3.php