如何在一行中使用由 && 分隔的 ls -l 语句计算所有文件?



我正在尝试从几个ls -l语句中计算由双&符号分隔的某些文件类型的所有文件,如:

ls -l *.xml && ls -l *.json && ls -l *.md 

技术我见过一个文件类型或所有文件只会数行结束字符使用egrep命令它发现:egrep -c '^-'

下面是一个ls -l命令的链接,用于查找所有文件的计数:链接到在堆栈溢出中使用egrep -c命令查询ls -l计数的问题。

如果我在单行命令中使用'ls -l'计算几个ls -l语句,并且对于每种文件类型,我如何在Linux中使用sh或bash shell脚本计算每个语句的总数?

我试过这个,它似乎不工作:

ls -l *.xml && ls -l *.json && ls -l *.md | egrep -c '^-'

我也试过:

ls -l *.xml && ls -l *.json && ls -l *.md | grep -v /$ | wc -l

不幸的是,它不喜欢连接结果的'&&'符号,并且由于某种原因它也不适合'|'(管道符号)。管道符号不能像我使用的那样与'&&'符号一起使用。

我不太确定我是否正确理解了这个目标。

如果您想要所有三种类型组合的总数:

ls *.xml *.json *.md | wc -l

首先,您需要为ls使用-d选项,以使其不展开作为目录的项并显示其中的所有文件。其次,您需要切断第一行(在顶部显示Total 45的一行)。第三个使用

ls -l *.xml && ls -l *.json && ls -l *.md 

等于

ls -l *.xml *.json *.md

,这样可以避免两次调用ls和两个进程。

ls仍然有一个问题,那就是你可以没有*.xml文件,你会得到(在标准错误上,即)*.xml: no such file。这是因为*通配符扩展是在shell中进行的,如果shell无法找到任何具有该名称的文件,则逐字传递该通配符。

最后,一种方法是:

ls -ld *.xml *.json *.md | tail +1 | wc -l

注意:

我不应该使用-l选项,它使您的搜索更加困难(ls需要更多的时间,因为它必须对每个文件进行stat(2),它在顶部输出令人讨厌的Total blocks行,您必须消除,并且您在目录列表之间得到一个空白行-如果您指定选项-d,则此功能将被消除-您也应该消除)。它将跳过不可读的文件(因为不可读的文件不能被stat(2)用于信息,并且您不会将额外的信息用于任何事情)。你可以只用

ls -d *.xml *.json *.md | wc -l

只获取与您在命令行中输入的模式匹配的名称(并剥离顶部使用的块行)。如果ls的输出通过管道连接到另一个命令,那么它不会像输出到终端时那样将输出按列分组。

无论如何,如果我必须使用一些工具来计数文件,我应该使用find(1),而不是(它允许更灵活的文件选择,并允许您递归搜索目录结构),如:

find . ( -name "*.xml" -o -name "*.json" -o -name "*.md" ) -print | wc -l

或者,如果您希望它只在当前目录中,只需添加-depth 1选项,就不会让它递归地搜索目录。

find . -depth 1 ( -name "*.xml" -o -name "*.json" -o -name "*.md" ) -print | wc -l

最新更新