このように空のディレクトリを使用しても大丈夫ですか?

このように空のディレクトリを使用しても大丈夫ですか?

内容が空のディレクトリを望んでいます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<.

関連情報