我想运行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