Terminal

文件名中的重定向和行數

  • August 28, 2021

我嘗試用​​ 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; } =(:)

引用自:https://unix.stackexchange.com/questions/666543