我想运行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 个的文件,然后删除它们。
对于你所问的问题(来源):
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)