如何将 wc 命令的结果传送到算术扩展中?

如何将 wc 命令的结果传送到算术扩展中?

我想运行wc -l并将结果用于算术扩展。换句话说,我想做这样的事情:

wc -l (now somehow pipe/pass the result of this to) $((2 + result of wc command))

我怎样才能做到这一点?

语境

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

以下是我目前所得到的:

ls | grep "Screenshot *" | sort -r | wc -l

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

答案1

对于你所问的(来源):

cat FILE | wc -l | xargs -n 1 bash -c 'echo $(($1 + 2))' args

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

man bash

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

选项
-c如果-c存在选项,则从第一个非选项参数读取命令命令字符串如果在命令字符串,第一个参数被分配给 $0,其余参数被分配给位置参数. 分配给$0设置 shell 的名称,用于警告和错误消息。

$ bash -c 'echo $1' aaa bbb ccc
bbb
$ bash -c 'echo $0' aaa bbb ccc
aaa
$ echo $0
/bin/bash

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

cat FILE | wc -l | xargs bash -c 'echo $(($0 + 2))'

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

find ~/Pictures/ -type f -name "Screenshot*" -mtime +20 -exec rm -i {} +

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

ls -lt ~/Pictures/Screenshot* | head -n 3

答案2

假设 FILE 是位于当前目录中的文件:

echo $((`wc -l < FILE`+2))  

wc -l < FILE返回FILE中的行数并echo $((`wc -l < FILE` +2))返回FILE中的行数+2。

将字符串转换为数值表达式相对简单,使用形式为算术扩展,其中是算术表达式。$((EXPRESSION))EXPRESSION

相关内容