秒単位で削除されたファイルを確認するスクリプト(引数として提供)

秒単位で削除されたファイルを確認するスクリプト(引数として提供)

数秒をパラメータとして一定時間の間セッションを維持した後、ホームディレクトリから削除されたファイルのリストを表示するスクリプトを作成します。睡眠前後の現在時刻と日付を表示するには、「日付」を使用してください。

 #!/bin/bash

time_b=$(date)

(sleep 30

ls -all $HOME | grep -v "(cat tmp_file.txt )" | while read s

do 

    echo deleted file: $s

done

echo Time before: $time_b

echo Time after: $(date)

)

ベストアンサー1

#!/bin/sh

snooze=$1

set -- "$HOME"/*

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

スクリプトは最初のコマンドライン引数を取得し、$1変数に割り当てますsnooze。次に、ホームディレクトリ内のすべてのファイルとディレクトリの名前(隠し名前を除く)を取得し、場所パラメータ(など)に割り当て$1ます$2

ユーザーが指定した就寝時間以前は、現在の日時を出力します。睡眠から目覚めた後、日付と時刻を再印刷します。

ループforはホームディレクトリの元の名前を繰り返し、その名前がまだ存在するかどうかをテストします。名前が見つからない場合は印刷されます(そしてパス名からディレクトリパスが削除されます)。

それはすべてです。

削除のみを検出したい場合一般ファイル(または一般ファイルへのシンボリックリンク)ホームディレクトリの内容に対して取得したパス名のリストに、次のファイルのパス名のみが含まれていることを確認する必要があります。

#!/bin/sh

snooze=$1

set --
for pathname in "$HOME"/*; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

ここでは単に節約だけではありませんみんなホームディレクトリに表示される名前でこれを繰り返し、正しいものとしてテストされ-fた名前(通常のファイルと一般ファイルへのシンボリックリンク)のみを保存します。ディレクトリはスキップされます。残りのスクリプトは以前と同じです。

削除検出隠されたファイルを送信する最も簡単な方法は、次のように切り替えることですbash(上記のスクリプトはを使用して実行されます/bin/sh)。

#!/bin/bash

shopt -s dotglob

snooze=$1

set --
for pathname in "$HOME"/*; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

唯一の違いは、#!コマンドが/bin/bashインタプリタによって実行されることを示す - 行とshopt -s dotglobシェルオプションを設定するシェルのコマンドです。このシェルオプションを使用すると、ファイル名のワイルドカードパターンが一致します(たとえば、隠された名前やドットで始まらない名前)。dotglobbash*

削除も検出サブディレクトリ少しトリッキーに聞こえますが、そうではありません。

#!/bin/bash

shopt -s dotglob globstar

snooze=$1

set --
for pathname in "$HOME"/**; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname#$HOME/}"
    fi
done

ここで唯一の違いは、このglobstarオプションも有効になっていることです。このシェルオプションを使用すると、同じように一致するがパス名を拡張できる**globパターンにアクセスできます。これでパターンが一致します。*/$HOME/**すべてホームディレクトリにあります。

また、ファイル名よりも多くを含めるように削除されたパス名の印刷を少し変更しました(サブディレクトリにある可能性があるため、表示するのに最適です)。サブディレクトリ)。

おすすめ記事