文件名中的重定向和行数

文件名中的重定向和行数

我尝试用以下行数命名一个文件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)

即使用=(...)进程替换的形式将脚本的输出存储在临时文件中(作为隐藏文件~而不是因此/tmpmv进行重命名),这里作为参数传递给匿名函数,该函数将其重命名为目标文件姓名。

或者将脚本的输出同时提供给临时文件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"

相关内容