使用grep列出目录中的条目

时间:2013-02-05 19:30:50

标签: linux unix grep ls

我正在尝试列出名称中只包含大写字母的目录中的所有条目。目录需要附加“/”。

#!/bin/bash
cd ~/testfiles/
ls | grep -r *.*

因为grep默认只查找大写字母(对吗?),所以我只是递归搜索testfiles下的目录,查找只包含大写字母的所有名称。

不幸的是,这不起作用。

至于附加目录,我不确定为什么我需要这样做。有谁知道我可以从哪里开始详细解释我可以用grep做些什么?此外,如何解决我的问题?

3 个答案:

答案 0 :(得分:1)

不,grep不只考虑大写字母。

你的问题我有点不清楚,例如:

  • 从您使用-r选项开始,您似乎想要递归搜索,但是您没有这么说。为简单起见,我假设您不需要;如果你需要递归,请考虑查看@twm的答案。
  • 您只想查找大写字母。这是否意味着你不想接受任何其他(非字母)字符,但这些字符直到文件名有效(如数字或破折号,点等)。
  • 因为你没有说我允许每行只有文件,我假设它没问题(因此使用ls -1)。

天真的解决方案是:

ls -1 | grep "^[[:upper:]]\+$"

即,打印仅包含大写字母的所有行。在我打印的TEMP目录中,例如:

ALLBIG
LCFEM
WPDNSE

然而,这会排除README.TXTFILE001等文件,这些文件最有可能包括在内(见上文)。

因此,更好的解决方案是:

ls -1 | grep -v "[[:lower:]]\+"

即,打印所有不包含小写字母的行。在我的TEMP目录中打印例如:

ALLBIG
ALLBIG-01.TXT
ALLBIG005.TXT
CRX_75DAF8CB7768
LCFEM
WPDNSE
~DFA0214428CD719AF6.TMP

最后,要使用尾随'/'“正确标记”目录,您可以使用-F(或--classify)选项。

ls -1F | grep -v "[[:lower:]]\+"

再次,示例输出:

ALLBIG
ALLBIG-01.TXT
ALLBIG005.TXT
CRX_75DAF8CB7768
LCFEM/
WPDNSE/
~DFA0214428CD719AF6.TMP

请注意,如果您可以使用不同的输出(例如find),则可以使用find ! -regex ".*[a-z].*"的其他选项,但这会有不同的输出。

答案 1 :(得分:0)

确切的正则表达式取决于ls命令的输出格式。假设你没有为ls使用别名,你可以试试这个:

ls -R  | grep -o -w "[A-Z]*"

请注意,在ls中使用-R,您将以递归方式列出当前目录下的目录和文件。 grep选项-o告诉grep只打印文本的匹配部分。 -w选项告诉grep只考虑整个单词的匹配。 "[A-Z]*"是一个regexp,只过滤大写字词。

请注意,此正则表达式将打印TEST.txt以及TEXT.TXT。换句话说,它只会考虑由字母组成的名称。

答案 2 :(得分:0)

ls列出了文件,而不是grep,因此您需要指定要将“/”附加到目录。使用ls --classify将“/”附加到目录。

grep用于处理来自ls(或一般其他来源)的结果,并且仅显示与您指定的模式匹配的行。它不限于大写字符。您可以将其限制为仅大写字符和“/”与grep -E '^[A-Z/]*$,或者如果您还需要数字,句点等,则可以使用grep -v -E [a-z]过滤掉包含小写字符的行。

由于grep不是列出文件的程序,因此它不是您要执行递归的位置。如果您使用lsls -R可以递归列出路径。但是,您只是想以这种方式获取文件路径的最后一个组件。

您可能需要考虑使用find来处理递归。这对我有用:

find . -exec ls -d --classify {} \; | egrep -v '[a-z][^/]*/?$'

我应该注意,使用ls --classify将“/”附加到目录的末尾也可以将一些其他字符附加到它可以分类的其他类型的路径上。例如,它可以在可执行文件的末尾附加“*”。如果这不好,但你可以分别列出目录和其他路径,可以通过运行find两次来解决这个问题 - 一次是针对目录,一次是针对其他路径。这对我有用:

find . -type d | egrep -v '[a-z][^/]*$' | sed -e 's#$#/#'

find . -not -type d | egrep -v '[a-z][^/]*$'

相关问题