如何将 wc 命令的结果通过管道传输到算术展开式中?

An *_*rer 5 command-line wc

我想运行wc -l并在算术展开中使用结果。换句话说,我想做这样的事情:

wc -l (now somehow pipe/pass the result of this to) $((2 + result of wc command))
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

语境

在我的~/Pictures目录中,我有多个名为“ Screenshot from YYYY-MM-DD hh-mm-ss.png”的文件,以及其他文件。我想保留所有非屏幕截图的文件,并且根据它们的最新情况仅保留指定数量的屏幕截图图片。我基本上只想保留最后 3 张最新的屏幕截图,并删除所有其余的。

到目前为止,这是我所拥有的:

ls | grep "Screenshot *" | sort -r | wc -l
Run Code Online (Sandbox Code Playgroud)

然后我想做的是从 中减去 3 wc -l,这样我就可以用来tail列出所有不是前 3 个的文件,然后删除它们。

Pab*_*chi 2

对于你所问的问题(来源):

cat FILE | wc -l | xargs -n 1 bash -c 'echo $(($1 + 2))' args
Run Code Online (Sandbox Code Playgroud)

bash -c 'commands'运行一个新的 bash 环境,其中$1是 给出的参数xargs。用于man the_commmand访问手册页并了解有关每个命令及其选项的更多信息。

man bash

概要
xargs [options] [command [initial-arguments]]

选项
-c如果-c存在选项,则从第一个非选项参数command_string读取命令。如果command_string之后有参数,则第一个参数将分配给 $0,所有剩余的参数将分配给位置参数对$0 的赋值设置了 shell 的名称,该名称用于警告和错误消息。

cat FILE | wc -l | xargs -n 1 bash -c 'echo $(($1 + 2))' args
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您可以避免使用占位符args(注意您可以使用任何单词),只需使用 $0 即可。另外,wc -l您可以避免-n 1

cat FILE | wc -l | xargs bash -c 'echo $(($0 + 2))'
Run Code Online (Sandbox Code Playgroud)

对于您需要的内容,可能更适合以交互方式删除 ( -i) 早于 20 天的文件。

find ~/Pictures/ -type f -name "Screenshot*" -mtime +20 -exec rm -i {} +
Run Code Online (Sandbox Code Playgroud)

要获取具有该名称模式的前 3 个最新文件更简单:

ls -lt ~/Pictures/Screenshot* | head -n 3
Run Code Online (Sandbox Code Playgroud)