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