内容が空のディレクトリを望んでいますmydir
が、すでに存在するか、いつ存在するのか、空であるかは事前にわかりません。だから私のアプローチは
mkdir -p mydir
rm -f mydir/*
どんな欠陥がありますか?より良い解決策は何ですか?
答え1
欠陥は、ディレクトリの自動強制削除を使用していることです。もちろん、その内容を削除するには、自動強制削除が必要です。再帰的ディレクトリを削除します。スクリプトのセキュリティの脆弱性にさらされます。
--one-file-system
たとえば、ロゴを確認してくださいrm
。おそらく、インストールされているファイルシステム上のすべてのファイルを削除したくはありませんmydir
。したがって、対応するフラグを含める必要があります(ただし略語はありません)。
また、バンドルの設置はどうですか? (参照man mount
と検索bind
)技術的には、これらのファイルは同じファイルシステムにあります。rm -rf
このファイルをどのように処理しますか?すべて削除されますか?これは望むものではないかもしれませんが、それを調べてrm
バインドマウントに関連する動作をテストする必要があります。おそらく私が考えていない他の極端なケースがたくさんあるでしょう。
これらすべての問題は、あなたがしないために発生します本物「ディレクトリとその内容を削除」するにはどうすればよいですか?実際に私が望むもの空のディレクトリで動作します。
一般的な原則は次のとおりです。何かを指定するときその他あなたが特に望むものではなく、これがあなたが望むものを得る方法だと思うので、不必要な複雑さを引き起こすことがよくあります。やるべきことは、指定する方法を見つけることです。あなたは何が欲しいですか?次に明示的に指定します。 *
Jeff Schallerがコメントで指摘したように、より良い解決策はmktemp
実際にこの目的のために設計されたものを使用することです。具体的には次のとおりですman mktemp
。
Create a temporary file or directory, safely, and print its name.
ディレクトリを作成する最も簡単な方法mktemp
は次のとおりです。
mydir="$(mktemp -d)"
その後、次のようにファイルをコピーできます。
cp somefile "$mydir/"
スクリプトの最後でディレクトリ操作が完了したら、次のことができます。安全に次のコマンドを使用して、その項目(および入力した内容)を削除します。
rm -rf "$mydir"
* この原則の別の例は、sed
コマンドを使用してフィールドベースまたは列ベースのファイルを処理することです。あなたはそれをすることができます...しかしあなたは指定することができます正確に必要なものをawk
はるかに複雑にしないでください。
答え2
mkdir
失敗する必要があるため失敗します。これは良いことです。失敗したコマンドは布材。テスト可能なエラーコードを正しく返します。だから簡単なのはそれをテストすることです。
:& cd -P "${TMPDIR:-/tmp}" || exit
x=$(((z=($$+$!)/2+1000)-1001))
until mkdir -m a=,u=rwx "work.$0.$((x+=1))" &&
cd -- "work.$0.$x"
do [ "$x" -lt "$z" ] || ! break
done 2>/dev/null &&
WORK=$PWD exec 9<.