ファイル名のリダイレクトと行番号

ファイル名のリダイレクトと行番号

次の行数でファイル名を指定しようとしています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)

つまり、=(...)プロセス置換を使用してスクリプトの出力を一時ファイル(単に名前を変更するのではなく~隠しファイルとして)に保存する場合、ここでは名前をターゲットファイルの名前に置き換える匿名関数にパラメータとして渡されます。/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"出力を一時ファイル()に保存します。これにより、一時ファイルが新しい名前に移動されます。$ttee

おそらく私のcrontabでリスト全体を予約するのではなく、別のスクリプトに入れて予約します。

スクリプトは次のとおりです。

#!/bin/sh

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

関連情報