2011-09-05 50 views
1

我跟随this guide在Linux中获得一些基本技能。BASH中使用'find'的问题

exercises of chapter 3部分,有两个练习:

*更改到你的home目录。创建一个新目录,并将/ etc目录下的所有文件全部复制到其中。确保你也复制 位于/ etc的子目录中的文件和目录! (递归复制)

*更改到新目录,使目录开始 以大写字符和一个用于文件的文件开始以较低的 字母字符。将所有文件移至相应的目录。使用 尽可能少的命令。

第一部分很简单,但我在第二部分遇到了问题(虽然我认为它也应该很简单)。

我成功完成了第一部分 - 也就是说,我在〜/ newetc中有一个/ etc文件夹的副本,将所有文件递归地复制到子目录中。

我创建了〜/ newetc/upper和〜/ newetc/lower目录。

我的意图是做一些类似于mv'find ...'./upper的例子。

但首先我想我应该确保我可以单独找到大写/小写的所有文件。在这个我失败了。

我以为找到〜/ newetc [A-Z]。 *(也尝试过:find〜/ newetc -name [A-Z]。*)查找所有大写文件 - 但它只是返回没有结果。

更奇怪的是:find〜/ newetc -name [a-z]。 *)只返回两个文件,虽然当然还有更多... 任何想法我做错了什么?

谢谢你的时间!

编辑:(我试图BTW读取find命令的人,但没有拿出任何东西)

+0

阅读困难的文档,一切都在那里。也许'info find'会比'man find'更好 – Rajish

回答

2

你需要的,如果你想使用正则表达式来使用引号

find ~/new_etc -name "[A-Z]*" 
find ~/new_etc -name "[a-z]*" 
+0

谢谢!这很奇妙! :D –

4

-name参数默认情况下并不需要一个完整的正则表达式。所以[A-Z].*只会匹配第二个字符是点。

使用表达式[A-Z]*或使用-regex-regextype以使用真正的正则表达式匹配。

+0

不会[A-Z] *只会返回只有0或更多大写字母的单词吗? 另请参见:-regex不给出任何结果,不适用于较低或大写模式([a-z]。*也不适用[A-Z]。*)且-regextype引发错误。 –

+0

@Lost_DM:'-name'需要一个shell匹配模式,而不是正则表达式。通配符模式中的'*'与正则表达式中的'*'非常相似(可能是因为'.'出现在文件名中,没有人想逃避这么常见的东西)。 –

0

如果你想找到所有的名称与您必须使用

find . -name "[A-Z]*" 

一个大写字母开头不

find [A-Z].* 

否则哟会试着找到所有以大写开头的文件信和有一个。刚过

+0

查找不起作用 - 请参阅'man'页面 – l0b0

+1

@ i0b0请...在downvoting之前在shell中输入命令...它实际上可以正常工作,我只是在测试它时如果你不相信它我贴你结果。 – Stefano

+0

这里是:“find [A-Z] *”返回本地文件夹中的LockDebug.log!请在需要的时候预留downvoting! – Stefano

0

,则必须使用-regex(或-iregex)。

0

对于找到的东西,其他答案告诉你如何去做。

对于移动查找的结果,请使用-exec标志(而在newetc是):

find -name "[A-Z]*" -exec mv {} upper/{} \; 
find -name "[a-z]*" -exec mv {} lower/{} \; 
0

-name参数取glob,而不是一个regular expression(这些都是非常有用的页面)。所以这个点对这个参数没有特殊的含义 - 它被解释为一个字面点字符。此外,在一个正则表达式中,*表示“以前的表达式为0或更多”,而在一个表达式中,它表示“任意数量的任何字符”。因此,正如其他人所指出的,下面应该让你与一个大写字母开始的当前目录下的所有文件:

find . -name '[A-Z]*' 
+0

非常棒的阅读。谢谢!非常感谢^ _ ^ –