次の行数でファイル名を指定しようとしていますcrontab
。
* * * * * ~/script > "~/targetfile-$(rows-count).csv"
私はできます:
* * * * * ~/script > "~/targetfile-$(~/script | wc -l).csv"
しかし、スクリプトを2回実行するよりも優れていると思います。
助けてください?ありがとう
答え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"