テキストファイルのファイル名のリストを繰り返し、ファイル名から日付を推測し、ライブラリスクリプト(./dropbox_uploader.sh delete [filname])を呼び出して、Dropboxアカウントからリモートエントリを条件付きで削除するbashスクリプトがあります。ファイルはDropboxのAPIを使用します。条件は、単にファイルが[n]日より古いかどうかです。 n はスクリプトの $2 位置に渡されます。 $ 1はアイテムを含むテキストファイルです。
2つのローカル変数$ goと$ stayは、ファイルが削除条件を満たすかどうかを計算します。スクリプトが終了したら、両方の変数の値を使用してメーラーを介して電子メールを送信します。
私の問題は、コマンドラインで実行するとすべてがうまく機能し、電子メールの内容は次のようになることです。
「Dropboxファイルが削除されました。554ファイルが削除され、310ファイルがアーカイブされました。」
しかし、私のユーザーのcrontabを使用してCronを介してスクリプトを実行すると、ローカル変数はすべて0 / nullのように見え、電子メールは次のようになります。
Dropboxファイル削除済み:削除されたファイル0個、アーカイブされたファイル0個。
cronの後にスクリプトを手動で再実行でき、変数はゼロではありません。
私はcronがユーザーのために実行されている方法について基本的なものを見逃していると思います。アドバイスをいただきありがとうございます。
私のスクリプト:
#!/bin/bash
threshold=$(date -d "$2 days ago" +%s)
go=0
stay=0
rm /home/pi/Dropbox-Uploader/camDeleteLog.txt
echo "deleting older than $2 days ago ..."
while IFS='' read -r line || [[-n "$line" ]]; do
line=$(echo $line | xargs) # trim spaces from the filename, just i$
y=${line:0:4}
m=${line:5:2}
d=${line:8:2}
#echo "Filedate is $y-$m-$d"
seconds=$(date -d "$y-$m-$d" +%s)
if ((seconds < threshold))
then
echo "Deleting file $go, $line"
((go++))
###echo "./dropbox_uploader.sh delete \"$line\""
./dropbox_uploader.sh delete "$line" >> /home/pi/Dropbox-Upload$
else
echo "$line is too new to delete"
((stay++))
fi
done < "$1"
echo "The dropbox files were purged: $go files deleted and $stay were kept." | $
私のユーザーpiのcrontab:
0 */8 * * * /home/pi/Dropbox-Uploader/moveVideostoDropbox.py # JOB_ID_1
0 0,6,12,18 * * * Dropbox-Uploader/processDBFiles.sh # JOB_ID_2
0 1,7,13,19 * * * Dropbox-Uploader/processByDate.sh camfiles.txt 2 # JOB_ID_3
タスク3は、日付の処理及び削除を担当する。タスク2と3は最初に一緒に実行されましたが、これが私の問題の原因であると間違っていたと思ったので、2つのタスクを分離し、実験のために1時間間隔で別々に実行しました。タスク2の実行時間は決してなかった。 1時間以上かかります。
ベストアンサー1
問題は、whileループがサブシェルで実装されることです。これは今後それについて議論し、潜在的な正しい解決策を議論します。
しかし、私はこの問題のためにイライラして完全に避けようとします。ファイルを使用して変数を保存しても、優雅さの点では得点は得られませんが、うまくいきます。この小さなスクリプトはポイントを示しています。
#!/bin/bash
c=0
FILE=/tmp/$(basename $0).$$
while IFS= read -r line; do
((c++))
echo "count=$c" > $FILE
done < somefile
. $FILE
echo "Read $count lines"
rm -f $FILE