我尝试在crontab中命名一个具有行计数的文件:
* * * * * ~/script > "~/targetfile-$(rows-count).csv"我能做到:
* * * * * ~/script > "~/targetfile-$(~/script | wc -l).csv"但我认为我可以做得更好,而不是两次执行脚本。
你能帮我吗?Thx
发布于 2021-08-27 21:41:56
将脚本的输出写入临时文件,计数该文件中的行数,并将该文件移动到新名称:
t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$len.csv"如果不使用GNU wc,则可以在$len值的开头或结尾获得空白字符。然后,你需要去掉这些:
t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$(( len + 0 )).csv"我在这里只运行"$HOME/script"一次,并将输出保存到一个临时文件($t)中,同时(由tee提供的复制数据)计算输出中的行数。然后将临时文件移到新名称。
我可能会把它放在一个单独的脚本中,并对其进行调度,而不是在我的crontab中调度整个列表。
剧本看起来就像
#!/bin/sh
tmpfile=$(mktemp) &&
length=$("$HOME/script" | tee -- "$tmpfile" | wc -l) &&
mv -- "$tmpfile" "$HOME/targetfile-$(( length + 0 )).csv"发布于 2021-08-28 06:35:59
在这里,您可以告诉cron使用zsh来解释命令行并执行以下操作:
SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ mv -- $1 ~/targetfile-$(($(wc -l < $1))).csv; } =(~/script)也就是说,使用进程替换的=(...)形式将脚本的输出存储在一个临时文件中(作为~中的隐藏文件,而不是/tmp中的隐藏文件,因此mv只是重命名),这里传递给一个匿名函数的参数,该函数将它重命名为目标文件名。
或者同时将脚本的输出提供给tempfile和wc -l:
SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ ~/script >&1 > $1 | wc -l | read n; mv -- $1 ~/targetfile-$n.csv; } =(:)https://unix.stackexchange.com/questions/666543
复制相似问题