首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件名中的重定向和行计数

文件名中的重定向和行计数
EN

Unix & Linux用户
提问于 2021-08-27 18:25:30
回答 2查看 86关注 0票数 0

我尝试在crontab中命名一个具有行计数的文件:

代码语言:javascript
复制
* * * * * ~/script > "~/targetfile-$(rows-count).csv"

我能做到:

代码语言:javascript
复制
* * * * * ~/script > "~/targetfile-$(~/script | wc -l).csv"

但我认为我可以做得更好,而不是两次执行脚本。

你能帮我吗?Thx

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-08-27 21:41:56

将脚本的输出写入临时文件,计数该文件中的行数,并将该文件移动到新名称:

代码语言:javascript
复制
t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$len.csv"

如果不使用GNU wc,则可以在$len值的开头或结尾获得空白字符。然后,你需要去掉这些:

代码语言:javascript
复制
t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$(( len + 0 )).csv"

我在这里只运行"$HOME/script"一次,并将输出保存到一个临时文件($t)中,同时(由tee提供的复制数据)计算输出中的行数。然后将临时文件移到新名称。

我可能会把它放在一个单独的脚本中,并对其进行调度,而不是在我的crontab中调度整个列表。

剧本看起来就像

代码语言:javascript
复制
#!/bin/sh

tmpfile=$(mktemp) &&
length=$("$HOME/script" | tee -- "$tmpfile" | wc -l) &&
mv -- "$tmpfile" "$HOME/targetfile-$(( length + 0 )).csv"
票数 1
EN

Unix & Linux用户

发布于 2021-08-28 06:35:59

在这里,您可以告诉cron使用zsh来解释命令行并执行以下操作:

代码语言:javascript
复制
SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ mv -- $1 ~/targetfile-$(($(wc -l < $1))).csv; } =(~/script)

也就是说,使用进程替换的=(...)形式将脚本的输出存储在一个临时文件中(作为~中的隐藏文件,而不是/tmp中的隐藏文件,因此mv只是重命名),这里传递给一个匿名函数的参数,该函数将它重命名为目标文件名。

或者同时将脚本的输出提供给tempfile和wc -l

代码语言:javascript
复制
SHELL=/bin/zsh
* * * * * TMPPREFIX=~/.; (){ ~/script >&1 > $1 | wc -l | read n; mv -- $1 ~/targetfile-$n.csv; } =(:)
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/666543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档