如果你有类似的东西:
find . -d -maxdepth 1 | wc -l | perl ...
你必须用什么方法告诉 perl 接受这个即将到来的变量并减去 1?
我尝试减去 1,因为 find 计算 1 的次数太多了。
答案1
Perl 在这里就有点矫枉过正了。
find . -maxdepth 1 -mindepth 1 | wc -l
(最好使用grep -c /
而不是wc -l
防止某些文件名中包含换行符)。
或者使用 GNU ls
:
ls -A | wc -l
和zsh
:
f=(*(D))
echo $#f
要删除一个:
... | tail -n +2 | wc -l
或者:
n=$(... | wc -l); echo "$(($n - 1))"
对于 perl,您可以使用-n
or-p
标志:
... | perl -lpe '--$_'
上面的表达式被求值,并为每行输入打印变量--$_
的内容 。$_
答案2
您得到错误答案是有原因的。在这种情况下,我希望您想要计算目录条目的数量,而不是看到列出的目录本身,如单点线所示,它是 find 输出的最后一行。
解决方案是隐藏不应从“wc -l”中计数的条目,例如
find . -depth -maxdepth 1 | grep -v "^\.$" | wc -l
由于 grep 可以计算行数,因此您可以使用它来节省启动额外可执行文件的需要,例如
find . -depth -maxdepth 1 | grep -vc "^\.$"
由于找到的项目数量不会根据您是否优先遍历深度而改变,因此您可以消除该选项,从而为您提供
find . -maxdepth 1 | grep -vc "^\.$"
答案3
我同意其他答案,perl 对于您似乎正在寻找的东西来说太过分了。也就是说,将 bash 变量传递给 Perl 当然有合理的理由。使用 export 和 perl 的环境变量,如下所示:
# i=$(find . -d -maxdepth 1 | wc -l) ; export i=$i ; perl -le 'print "Removing one from $ENV{i} for ".($ENV{i}-=1)'; unset i
对于 shell 的数值解:
# i=$(find . -d -maxdepth 1 | wc -l) ; echo i=$((i-1))