私は、sdaではないすべてのドライブを取り、それらでshredを実行し、出力をログファイルにダンプする1つのコマンドを作成しようとしています。これまでのところ
find /dev/ -name "sd?" -not -name "sda" -exec [shred -fvz {} > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I {} | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1 &] \;
あなたが見ることができるように、私はグーグルを検索してこれにかなりの距離を置いてきましたが、今私は得た出力が
[1] 13097
{}: No such file or directory
]: command not found
[1]+ Exit 1 find /dev/ -name "sd?" -not -name "sda" -exec [shred -fvz {} > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I {} | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1
誰か提案がありますか?
また、私は現在この問題に取り組んでいますが、提案はいいでしょう。走るとき
shred -fvz /dev/sdb > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I /dev/sdb | grep 'Serial\ Number' |cut -f2- -d:).log 2>&1
あいまいなリダイレクトエラーが表示されます。
編集:元の答えはfind
コマンドが機能しなかった理由の一部を示していますが、find
を使用するループはUSB HDDでは機能しません。より良いバージョンを見つけるには、答えの一番下までスクロールします。
USBフラッシュドライブではロギングがまったく機能しないことに注意してください。 hdparm
はHDD専用です。
find
コマンドは機能しません。まったく。どうして?
いくつかの問題がありますが、主なものはこれです:-exec
オプションは、最初の引数の名前を持つ実行可能ファイルをPATH
で探し、セミコロンまでfind
への他の引数で実行します。 notはシェルに引数を渡します。つまり、使用を意味します$(...)
、redirection、などは機能しません。
これをどのように修正しますか?いくつかの方法があります。
最も明らかなのは、コマンドをシェルに渡すことです。
find . -name testing12345 -exec bash -c '...$(...)... > /path/to/some/file 2>&1' \;
はい、これは機能しますが、複数の種類の引用符を含む複雑な式では、エスケープはすぐに悪夢になります。
多くの場合、これを行う最も簡単な方法はループを使用することです。既に有効なfind
コマンドがあるので、これを行う最も簡単な方法は、-exec
引数を取り、それをループにパイプすることです。
find (your find arguments here) -print0 | while IFS= read -r -d $'\0' filename; do
# process "$filename"
done
find
およびread
のIFS=
および-print0
および-d $'\0'
オプションは、ファイル名の改行に関する問題を回避します。 -r
オプションは、read
がファイル名のバックスラッシュを処理しないようにします。
それと他の問題の修正を組み合わせて、これが得られます。
find /dev/ -name "sd?" -not -name "sda" -print0 | while IFS= read -r -d $'\0' filename; do
if (hdparm -i "$filename" > /dev/null 2>&1); then
shred -fvz "$filename" > /home/ben/ProjectsInProgress/ShredLogs/$(hdparm -i "$filename" | grep -o 'SerialNo=\S*' |cut -f2 -d=).log 2>&1 &
fi
done
ディスクを細断処理したくないので、echo
の代わりにshred
ステートメントを使用して自分でテストしただけです。
編集:find
バージョンはUSB HDDで壊れています。 lsblk
を使用するこの修正バージョンは、正常に機能します。
lsblk -ld | grep -o '^sd[b-z]' | while read -r filename; do
filename="/dev/$filename"
shred -fvz "$filename" > "/home/ben/ProjectsInProgress/ShredLogs/$(hdparm -I "$filename" | grep -o 'Serial Number:\s*\S*' | cut -f2 -d: | sed 's/^\s*//').log" 2>&1 &
done
このスクリプトは、あなたが望むことをするはずです。ルートとして実行する必要があることに注意してください!
#!/bin/bash
logpath="/home/ben/ProjectsInProgress/ShredLogs"
lsblk -l | grep -o '^sd[b-z] ' | while read f; do
logfile="$logpath/$(hdparm -i "/dev/$f" | grep -oP "(?<=SerialNo=)\w+")"
shred -fvz "$f" &> "$logfile"
done
@ terdon に感謝します。この改善された(そして願わくば修正された)バージョンを提供してくれました。
それが機能するかどうか教えてください、私は自分のディスクを細断することをテストすることにあまり動機はありません...