我尝试用以下行数命名一个文件crontab
:
* * * * * ~/script > "~/targetfile-$(rows-count).csv"
我可以 :
* * * * * ~/script > "~/targetfile-$(~/script | wc -l).csv"
但我认为我可以做得更好,而不是执行脚本两次。
你能帮助我吗 ?谢谢
答案1
在这里,您可以告诉cron
使用zsh
解释命令行并执行以下操作:
SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ mv -- $1 ~/targetfile-$(($(wc -l < $1))).csv; } =(~/script)
即使用=(...)
进程替换的形式将脚本的输出存储在临时文件中(作为隐藏文件~
而不是因此/tmp
仅mv
进行重命名),这里作为参数传递给匿名函数,该函数将其重命名为目标文件姓名。
或者将脚本的输出同时提供给临时文件wc -l
:
SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ ~/script >&1 > $1 | wc -l | read n; mv -- $1 ~/targetfile-$n.csv; } =(:)
答案2
将脚本的输出写入临时文件,计算该文件中的行数并将文件移动到新名称:
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"