web-dev-qa-db-ja.com

/ dev / sda以外のすべてのディスクを細断処理して、出力をファイルに記録するにはどうすればよいですか?

私は、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

あいまいなリダイレクトエラーが表示されます。

4
Ben Stumpf

編集:元の答えは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およびreadIFS=および-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
2

このスクリプトは、あなたが望むことをするはずです。ルートとして実行する必要があることに注意してください!

#!/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 に感謝します。この改善された(そして願わくば修正された)バージョンを提供してくれました。

それが機能するかどうか教えてください、私は自分のディスクを細断することをテストすることにあまり動機はありません...

2
Byte Commander