我正在尝试列出名称中只包含大写字母的目录中的所有条目。目录需要附加“/”。
#!/bin/bash
cd ~/testfiles/
ls | grep -r *.*
因为grep默认只查找大写字母(对吗?),所以我只是递归搜索testfiles下的目录,查找只包含大写字母的所有名称。
不幸的是,这不起作用。
至于附加目录,我不确定为什么我需要这样做。有谁知道我可以从哪里开始详细解释我可以用grep做些什么?此外,如何解决我的问题?
答案 0 :(得分:1)
不,grep不只考虑大写字母。
你的问题我有点不清楚,例如:
ls -1
)。天真的解决方案是:
ls -1 | grep "^[[:upper:]]\+$"
即,打印仅包含大写字母的所有行。在我打印的TEMP目录中,例如:
ALLBIG
LCFEM
WPDNSE
然而,这会排除README.TXT
或FILE001
等文件,这些文件最有可能包括在内(见上文)。
因此,更好的解决方案是:
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
不是列出文件的程序,因此它不是您要执行递归的位置。如果您使用ls
,ls -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][^/]*$'