30分より古いディレクトリに特定のファイルがあることを確認しています。
curr_epch=`date +%s`
curr_epch_buff=`expr $curr_epch - 1800`
ls -l --time-style=+"%s" | grep .part | awk '{ if (($6 >= $curr_epch_buff)) print $6 }'
ただし、上記のコードは、言及された条件に関係なく結果を提供します。
デバッグするためにこれら2つの値の差を計算しようとすると、期待した結果が得られず、代わりに次の結果が表示されます。$6次のように印刷されます。
ls -l --time-style=+"%s" | grep .part | awk '{ print (expr $6 - $curr_epch_buff) }'
ただし、上記のクエリを使用して静的数値を減算しようとすると、期待した結果が表示されます。
ls -l --time-style=+"%s" | grep .part | awk '{ print (expr $6 - 200) }'
上記の最初と2番目のコードセットにどのような問題があるのか教えてください。
答え1
--see
$(...)
の代わりに`...`
https://mywiki.wooledge.org/BashFAQ/082
bashは算術演算を実行できるのでexpr
。
解析されないls
curr_epch_buff=$( date -d '30 minutes ago' +%s )
for file in *.part; do
file_mtime=$( stat -c '%Y' "$file" )
if (( file_mtime < curr_epch_buff )); then
echo "$file is older than 30 minutes"
fi
done
問題awk '{ print (expr $6 - $curr_epch_buff) }'
:
curr_epch_buff
考慮awk変数。設定されていません。- awk は
$n
演算子のように動作し、参照されるフィールド番号の内容を返します。n
- 数値コンテキストで設定されていない変数は、数値 0 として扱われます。
- so はレコード全体と同じです
$curr_epch_buff
。$0
expr
また、設定されていない変数ですexpr $6
文字列連結で、結果は内容です。$6
$6 - $0
- レコードは数字で始まらず、返されたファイル権限文字列で始まります。
ls -l
- awk は、数字で始まらない文字列をゼロとして扱います。
- レコードは数字で始まらず、返されたファイル権限文字列で始まります。
最終結果は値です。$6
答え2
if [ -z "$(find . -name '*.part' -mmin -30)" ]
then
echo ".part file is old"
else
echo ".part file is recent"
fir