0

フォルダのファイルを一覧表示し、それらに対してアクションを実行する(PDFに出力する)シェルスクリプトを作成しましたが、空白のPDFを取得することがよくあります。生成されたPDFを削除すると、新しいPDFは常に正しく生成されます。

ファイルが完全にコピーされる前にスクリプトが印刷を開始したためだという印象があります(コピーはOSエクスプローラーを介して、名前を付けて保存するか、単にコピーして貼り付けます)。

誰かが新しいファイルを追加するときに管理するのは私ではありません。コピーはネットワーク共有を使用するユーザーからのものです。

だから、このようなものを持つ方法はありますか?

for inputFile in `ls -l $SearchPattern | grep ^- | awk '{print $9}'`
do
   //CHECK_THAT_THE_FILE_HAS_ALREADY_BEEN_FULLY_SAVED_ONCE 
   //DO_MY_PRINT_HERE
done
4

4 に答える 4

2

誰かが指摘したように、ファイル変更時間を使用すると便利な場合があります。役に立つかもしれないこのスクリプトをすぐに実行しました。特定のファイルの最終変更時刻から 5 秒が経過するまで待機します。

#!/bin/bash

function getTimeFromLastChange() {
    file=${1}
    let lastAccess=$(stat --format=%Y ${file})
    let now=$(date +%s)
    let timePassed=$((now - lastAccess))
    echo ${timePassed}
}

file=./test
while [ true ]; do
    let lastChange=$(getTimeFromLastChange ${file})
    if [ "${lastChange}" -lt 5 ]; then
        echo "waiting"
        sleep 1
    else
        echo "done"
        exit
    fi
done

echo ${timePassed}

ここで重要なのは、stat (http://linux.die.net/man/1/stat) を使用して、指定されたファイルの最終変更時刻を UNIX エポック時間からの秒数で取得する「getTimeFromLastChange」関数です。次に、日付 (http://linux.die.net/man/1/date) を使用して現在の時刻を取得し (ここでも、UNIX エポック時刻からの秒数)、それらを減算し、それ以降の合計秒数を計算します。最終変更時刻。

メインループは、「安全な」秒数が経過するまで待機します。したがって、このパラメーターを調整して、数 N 秒前に書き込まれた/変更されたファイルを出力することができます。

サンプル実行:

marcelog@host ~ $ touch ./test
marcelog@host ~ $ ./try.sh
waiting
waiting
waiting
done

100%安全ではありません。でもやってみる価値はあると思います。

それが役に立てば幸い!

于 2012-05-07T13:20:31.763 に答える
0

私は使用して終了しました

for inputFile in `find $SearchPattern2 -maxdepth 1 -type f -cmin +1 -iname "*.pdf"`

-cmin +1 は検索することを示します。つまり、変更時刻が 1 分以上前のファイルのみをリストする必要があります。

100% 安全というわけではありませんが、多くのマージンを持ってすべてのケースを処理できます。

これを数秒で行う方法が見つかりませんでした

于 2012-05-09T10:40:46.340 に答える
0

データの変更時間を確認し、そのしきい値を設定する必要があります。ファイルに保留中の操作がないかどうかを確認する他の (簡単な) 方法はありません。

だからあなたは使うべきです

ls -l -t

上記のステートメントを見つけて、時間のしきい値に応じて「ソート」を介してパイプします。

ご挨拶

于 2012-05-07T13:08:48.710 に答える