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

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

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

 #!/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/**すべてホームディレクトリにあります。

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

答え2

#!/usr/bin/env bash

sleep_time=$1
time_a=$(date)

mapfile -t files_a < <(find "$HOME" -type f -maxdepth 1)

sleep "$sleep_time"

mapfile -t files_b < <(find "$HOME" -type f -maxdepth 1)

comm -23 <(printf '%s\n' "${files_a[@]}" | sort) <(printf '%s\n' "${files_b[@]}" | sort)

printf '%s\n' "We started at: $time_a" "We ended at: $(date)"
  • sleep_time=$1
    • 睡眠時間のパラメータを提供するように求められました。あなたの主張は次のように表されます。位置パラメータあなたのスクリプトから。つまり、呼び出すと、./script.sh 30最初の位置引数はと同じです30
  • time_a=$(date)
    • 元のコードで既に調べていますが、これは開始時刻を表示するために使用される日付です。
  • mapfile -t files_a < <(find "$HOME" -type f -maxdepth 1)
    • ここでは状況がさらに複雑になります。前と後のファイルのリストを比較できるように、ファイルのリストを作成する必要があります。ここでは、マップファイルを使用してそのファイルの配列を作成します。これで配列を直接作成できますが、ファイルにスペースや改行文字が含まれていると問題が発生します。 mapfileがうまく機能します。
    • find "$HOME" -type f -maxdepth 1$HOME- ディレクトリ内のすべてのファイル形式のファイルのリストが印刷されます(サブディレクトリに再帰されません)。
  • sleep "$sleep_time"
    • ここは私たちが決めた時間に眠る場所です。
  • mapfile -t files_b < <(find "$HOME" -type f -maxdepth 1)
    • 比較のために、スリープモードの後に​​2番目のファイル配列を作成しています。
  • comm -23 <(printf '%s\n' "${files_a[@]}" | sort) <(printf '%s\n' "${files_b[@]}" | sort)
    • このcommユーティリティは2つのファイルを読み取り、3つの列((1)行)を印刷します。ただファイル1の行(2)ただfile2 では、2 つのファイルの (3) 行です。 file1の一意の行にのみ興味があるので、パラメータを使用して-23列2と3を抑制します。次に、私たちが使用するファイルの代わりに配列にファイルを保存するので、プロセスの交換配列をcommファイルに渡します。
  • printf '%s\n' "We started at: $time_a" "We ended at: $(date)"
    • 開始時刻と終了時刻を印刷します。

答え3

これは私にとって大学の課題のように感じました。あなたのスクリプトが理解できないので、あなたが言ったように試してみましょう。

  • 数秒をパラメータとして使用し、しばらくセッションを維持するスクリプトを作成します(睡眠)。

あなたのbashスクリプトは、次のパラメータを使用して実行する必要があるとします。./script 30 https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Parameters

  • これにより、ホームディレクトリから削除されたファイルのリストが表示されます。
for file in $HOME/*; do
    # if it is a file
      #save the value of $file on a log file placed not in your $HOME directory
      #delete the file
done

http://mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

  • 睡眠前後の現在時刻と日付を表示するには、「日付」を使用してください。これは自明です。
dateBefore="$(date)"
#sleep command here
dateAfter="$(date)"
echo "Date before sleep : $dateBefore"
echo "Date before after sleep : $dateBefore"

私はあなたがこの問題を解決するのを助けるために全力を尽くしたので、あなたは自分でこのスクリプトを完了できると仮定することができます。それでもできない場合は、マニュアルページとGoogleを使用してみてください。)

関連情報