Terminal
文件名中的重定向和行數
我嘗試用 a 中的行數命名一個文件
crontab
:* * * * * ~/script > "~/targetfile-$(rows-count).csv"
我可以 :
* * * * * ~/script > "~/targetfile-$(~/script | wc -l).csv"
但我認為我可以做得更好,而不是執行兩次腳本。
你能幫助我嗎 ?謝謝
將腳本的輸出寫入臨時文件,計算該文件中的行數並將文件移動到新名稱:
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"
在這裡,您可以告訴
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; } =(:)