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
。
或者:使用find
shell 扩展的乐趣:
echo $(($(find -maxdepth 1 -type f -printf '+1')))