数秒をパラメータとして一定時間の間セッションを維持した後、ホームディレクトリから削除されたファイルのリストを表示するスクリプトを作成します。睡眠前後の現在時刻と日付を表示するには、「日付」を使用してください。
#!/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
シェルオプションを設定するシェルのコマンドです。このシェルオプションを使用すると、ファイル名のワイルドカードパターンが一致します(たとえば、隠された名前やドットで始まらない名前)。dotglob
bash
*
削除も検出サブディレクトリ少しトリッキーに聞こえますが、そうではありません。
#!/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/**
すべてホームディレクトリにあります。
また、ファイル名よりも多くを含めるように削除されたパス名の印刷を少し変更しました(サブディレクトリにある可能性があるため、表示するのに最適です)。何サブディレクトリ)。