如何在一行中使用 && 分隔的 ls -l 语句来计算所有文件?
How to count all the files using ls -l statements separated by && in a single line?
我正在尝试计算来自几个 ls -l 语句的所有文件,这些文件类型由双符号分隔,如下所示:
ls -l *.xml && ls -l *.json && ls -l *.md
我见过的针对单个文件类型或所有文件的技术将简单地计算它使用 egrep 命令找到的所有行尾字符:egrep -c '^-'
这是一个 link 用于单个 ls -l 命令来查找所有文件的计数:Link to a question about ls -l count using egrep -c command in stack overflow.
如果我使用 like 'ls -l' 在单行上使用命令计算多个 ls -l 语句,并且对于每种文件类型,我如何使用 sh 或 [ 计算 Linux 中每个语句的总数=30=] 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
不幸的是,它不喜欢连接结果的“&&”符号,而且它也不适用于“|” (管道符号)出于某种原因。管道符号不能像我使用的那样与“&&”符号一起使用。
我不太确定我是否理解 objective 正确。
如果您想要所有三种类型的总和:
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
个文件,并且您将得到(在 stderr 上,即)一个 *.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
我正在尝试计算来自几个 ls -l 语句的所有文件,这些文件类型由双符号分隔,如下所示:
ls -l *.xml && ls -l *.json && ls -l *.md
我见过的针对单个文件类型或所有文件的技术将简单地计算它使用 egrep 命令找到的所有行尾字符:egrep -c '^-'
这是一个 link 用于单个 ls -l 命令来查找所有文件的计数:Link to a question about ls -l count using egrep -c command in stack overflow.
如果我使用 like 'ls -l' 在单行上使用命令计算多个 ls -l 语句,并且对于每种文件类型,我如何使用 sh 或 [ 计算 Linux 中每个语句的总数=30=] 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
不幸的是,它不喜欢连接结果的“&&”符号,而且它也不适用于“|” (管道符号)出于某种原因。管道符号不能像我使用的那样与“&&”符号一起使用。
我不太确定我是否理解 objective 正确。
如果您想要所有三种类型的总和:
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
个文件,并且您将得到(在 stderr 上,即)一个 *.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