💣

ディレクトリ内の全ファイルを shred する方法

2021/03/02に公開

ディレクトリを shred することはできない

ファイルやディスクを完全消去するコマンドとして shred コマンドというものがありますが、ディレクトリに対しては使用できません。

$ shred dir
shred: dir: failed to open for writing: Is a directory

rmcp では -r オプションを付ければディレクトリを操作することができますが、shred にはそのようなオプションは存在しません。

では、ディレクトリ内に存在するすべてのファイルを完全消去したい場合にはどうしたら良いでしょうか。その方法を紹介します。

Tips: rm コマンドが「完全消去」ではない理由について

rm コマンドでは完全消去にはならない理由については こちら を参照してください。

解決法

dir というディレクトリを完全消去したい場合、以下のコマンドを実行するだけです。

$ find dir -type f -print0 | xargs -0 shred -uvz
$ rm -rf dir

解説

find dir -type f -print0

find コマンドで dir ディレクトリ内のファイルのみを相対パスで一覧表示します。-type f は「ファイルのみ」を表示するオプションです。

xargs -0 shred -uvz

xargs コマンドを使って shred にファイル一覧を渡します。

shred のオプション -uvz はそれぞれ、shred 後にファイルを削除、進捗表示、ランダム値書き込み後に 0 埋めをするオプションです。

-print0 と -0 について

find コマンドの -print0xargs コマンドの -0 については以下を参照してください。

findとxargsコマンドで-print0オプションを使う理由(改)

rm -rf dir

最後に結局 rm 使ってるんですが、これは空のディレクトリとシンボリックリンクを削除するためです。shred コマンドではあくまでディレクトリ内のすべてのファイル (シンボリックリンクを除く) を完全消去しただけで、残った空のディレクトリとシンボリックリンクまでは削除してくれません。なので rm コマンドで空のディレクトリとシンボリックリンクを削除します。

rm コマンドではなく、本当にファイルが shred コマンドで消えたのか不安な場合は rm 実行前に tree コマンドなどを利用して空のディレクトリとシンボリックリンクのみのツリーになっていることを確認すると良いでしょう。

参考

GitHubで編集を提案

Discussion