将管道变量传递给 perl oneliner

将管道变量传递给 perl oneliner

如果你有类似的东西:

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,您可以使用-nor-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))

相关内容