我正在尝试从几个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