grep 在 find 命令上运行时未产生正确的输出

grep 在 find 命令上运行时未产生正确的输出

ls我的任务是在不使用和命令的情况下打印当前目录中的文件数量wc

我在脚本中输入了以下几行:

#!/bin/bash
find . -maxdepth 1 -type f \( ! -iname ".*" \) > list3
grep .* -c list3 > /dev/tty

输出为:

..:0
.6.1c.sh.swp:1
list3:22

而根据我的理解它应该只是:22

为什么这不管用?

答案1

为什么grep不能正常工作

它不起作用,因为您需要知道grep.*就是您正在寻找的实际模式。

grep '.*' -c list3

如果你不使用单引号,你的 shell 将扩展.*为目录中每个文件的名称。这称为文件名扩展。例如a.txt b.txt,所以grep会看到:

grep a.txt b.txt -c list3

自从单引号防止扩张发生,这是要走的路。


你的命令有误的地方grep

顺便说一句,你在这里使用模式的方向错了。.正则表达式中的句点匹配任何字符,而不是文字点。请参阅这一man了解更多信息。所以你的正则表达式目前是这样的:“找到任意字符,然后找到任意字符的序列”。相当多余。

如果你确实想匹配:

[点] [其他]

…你需要对点进行转义:

\.*

find你的命令可以改进的地方:

我不知道你所说的摆脱是什么意思

\( ! -iname ".*" \)

您的find命令将在任何文件前加上当前工作目录的点号,因此您不会在这里删除任何内容。您可以直接运行:

find . -maxdepth 1 -type f

答案2

为了解决原始问题,计算没有ls和 的文件数wc

纯 shell 语法:

files=0
for i in *; do
    [ -f "${i}" ] && files=$((files+1))
done
echo ${files}

要将隐藏文件添加到计数中,只需在循环之前更改通配符设置for

或者:使用findshell 扩展的乐趣:

echo $(($(find -maxdepth 1 -type f -printf '+1')))

相关内容