2

この投稿は更新されています。解決策については以下をご覧ください。

常に存在するとは限らないファイルの存在についてフォルダーを確認する必要があります。

私は次のようなスクリプトを作成しました:

#!/ビン/sh
真の間; 行う
file=/パス/to/ファイル
if [[ "$file" = *ファイル名* ]]
それから
echo "$ファイルが存在します"
そうしないと
echo "存在しません"
フィ
睡眠 3
終わり

ファイルを削除または移動するまで、「$ file is present」が継続的に繰り返されるという事実を除いて、完全に機能します。"echo "$file is present" の後に挿入してアラートを停止し、このファイルのチェックを続行するには、どのコマンドを使用できますか (たとえば、ファイルが再び利用可能になったとき)。

ありがとうございました。

8時間まで回答を追加できないため、ここに私の解決策を投稿します:

とにかく、私はこのスクリプトを使用して解決しました:ファイルの時間を現在の日付と比較し、「タッチ」を使用して日付を10秒前に変更します:

    #!/ビン/sh
    真実でありながら
    行う
    cd $(dirname "$0")
    current=$(pwd)
    cd /ブート/ホーム/ダウンロード
    last=$(ls -t | head -n1)
    name=$(basename "$last")
    filedate=$(date -r "$last" +%G%m%d%H%M%S)
    currentdate=$(date +%G%m%d%H%M%S)
    if [ "$filedate" -eq "$currentdate" ]
    それから
    echo "$name" "存在します"
    touch -d '-10 秒' "$name"
    フィ
    終わり

ファイル名に関係なく、尊敬され、独立して動作するようになりました! すべての新しいファイルについて一度だけ警告し、そのフォルダーを監視し続けます:-)

スクリプトの全履歴を保持するために、以下に iamauser のスクリプトがあります。私はこのスクリプトを少し改良しました: フォルダ内のすべての新しいファイル (名前、種類などから独立して) について警告し、削除されたファイルについても警告します:-)

    #!/ビン/バッシュ                                                                                                                                                                                         
    cd /ブート/ホーム

    filename=$(ls -t | head -n1)                                                                                                                                                                                     
    tstamp=$(stat --print "%Y" "$filename")                                                                                                                                                            
    真の間; 行う
    prev=$(ls "/boot/home/Downloads" | tr '\n' '\n' > /tmp/prev.txt)
    check=$(ls -t /boot/home/Downloads | head -n1)

     もしも [ !-d "$ファイル名" ]; それから
    after=$(ls "/boot/home/Downloads" | tr '\n' '\n' > /tmp/after.txt)

            echo "存在しません";
            睡眠 5;                                                                                                                                                    
        elif [[ "$filename" == "$filename" && $tstamp -ne $(stat --print "%Y" "$filename") ]]; それから
    睡眠 2
    difference=$(comm -2 -3 "/tmp/after.txt" "/tmp/prev.txt">/tmp/Diff.txt)
    lost=$(cat /boot/common/cache/tmp/Diff.txt)                                                                                                              
            alert --idea "/boot/home/Downloads: $check は、このフォルダー内の最新のファイルです。";
            alert --idea "/boot/home/Downloads: $lost が削除されました。";                                                                                                                                                                 
            tstamp=$(stat --print "%Y" "$filename")                                                                                                                                                        
        そうしないと                                                                                                                                                                                            
            睡眠 3;                                                                                                                                                                                    
        フィ                                                                                                                                                                                              
    終わり

4

2 に答える 2

1

このようなものがうまくいくかもしれません。ファイルのタイムスタンプをチェックして、フォルダーに同じファイル名の新しいコピーがあるかどうかを確認しています。

#!/bin/bash                                                                                                                                                                                         

filename="/path/to/file"                                                                                                                                                                                     
tstamp=$(stat --print "%Y" "$file")                                                                                                                                                                 
while true; do                                                                                                                                                                                      
    if [ ! -f "$filename" ]; then                                                                                                                                                                       
        echo "Not present";
        sleep 5;                                                                                                                                                             
    elif [[ "$filename" == "myfile" && $tstamp -ne $(stat --print "%Y" "$filename") ]]; then                                                                                                              
        echo "$filename is present";                                                                                                                                                                    
        tstamp=$(stat --print "%Y" "$filename")                                                                                                                                                         
    else                                                                                                                                                                                            
        sleep 3;                                                                                                                                                                                    
    fi                                                                                                                                                                                              
done   

スクリプトの実行中にファイル名をタッチして、スクリプトをテストしました。タッチするたびに、$filename is present.

于 2013-09-01T03:42:21.567 に答える
0

はい、コンソールボックス。あなたが正しい。CPU 使用率を下げるためにスリープを追加しても、私のスクリプトは完璧ではありません。いずれにせよ、おそらく、iamauser のスクリプトで何かを見逃しています: 上記のスクリプトは、ファイルが存在しないときにエコーを出力しますが、存在するときにエコーを出力しません..なぜですか?

とにかく実験したいので、別の方法も考えていました: "ls -1 | wc -l" を使用してフォルダー内のファイルの数を確認し、新しいファイルが追加され、ファイルの数が + "ls -1 | wc -l" よりも 1 大きいので、ファイル名から独立してアラートを受け取ることができます..任意の名前のファイルがある場合、スクリプトは新しいファイルをチェックしながら、一度アラートを出す必要がありますフォルダ内のファイル。他の提案はありますか?

ありがとうございました!

アップデート

わかりました: これはスクリプトの決定版です: 新しいファイルがフォルダーに書き込まれると、このスクリプトは私に警告します。このファイルを削除すると、スクリプトはそのフォルダーにある最新のファイルについて警告します。これは私が探していたものなので、とてもいいです:-)

私は Haiku を使用しているので、「エコー」を警告、警告ウィンドウ、一種のグラフィック「エコー」に置き換えました。

    #!/ビン/バッシュ                                                                                                                                                                                         
    cd /ブート/ホーム

    filename=$(ls -t | head -n1)                                                                                                                                                                                     
    tstamp=$(stat --print "%Y" "$filename")                                                                                                                                                            
    真の間; 行う

    check=$(ls -t /boot/home/Downloads | head -n1)                                                                                                                                                                                          
        もしも [ !-d "$ファイル名" ]; それから                                                                                                                                                                       
            echo "存在しません";
            睡眠 5;                                                                                                                                                             
        elif [[ "$filename" == "$filename" && $tstamp -ne $(stat --print "%Y" "$filename") ]]; それから                                                                                                              
            alert --idea "/boot/home/Downloads: $check はこのフォルダー内の最新のファイルです";                                                                                                                                                                    
            tstamp=$(stat --print "%Y" "$filename")                                                                                                                                                        
        そうしないと                                                                                                                                                                                            
            睡眠 3;                                                                                                                                                                                    
        フィ                                                                                                                                                                                              
    終わり

于 2013-09-01T19:12:06.410 に答える