ディレクトリが存在するかどうかを確認し、1つのコマンドで削除します。


106

Unixで単一のコマンドを使用して、ディレクトリが存在するかどうかを確認し、存在する場合は削除することはできますか?リモートマシンで単一のコマンドしか実行できないANT 'sshexec'タスクを使用している状況があります。そして、ディレクトリが存在するかどうかを確認して削除する必要があります...


なぜrmdirを使用しないのですか?ディレクトリが存在しない場合、失敗します。
Ferruccio 2011年

4
失敗します。そして、私のANTスクリプトのエラー。これにより、ビルドがクラッシュします。
レモ2011年

mkdir -pすでに存在する場合、を使用してもエラーは無視されます。
user562374 2011年

2
@ Ferruccio- rm -rf / dir_nameを使用してもエラーはスローされませんが、rm -rf / dir_name throwsを実行すると、そのようなファイルまたはディレクトリは見つかりませんでした。(テスト済み)
レモ2011年

3
同じコマンドを2回投稿した@remo bro
Marcos Pereira、

回答:


149

$WORKING_DIRディレクトリに設定されていると仮定して...このワンライナーはそれを行うべきです:

if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi

(それ以外の場合は、ディレクトリに置き換えるだけです)


161

なぜ使用しないのrm -rf /some/dirですか?存在する場合はディレクトリが削除され、存在しない場合は何も行われません。rm -r /some/dirこのフレーバーとは異なり、フォルダーが存在しない場合でもコマンドはクラッシュしません。


13
元の質問は、ファイル/ディレクトリが存在するかどうかにかかわらず削除を実行することを意図していたと思います。このコマンドは機能し、同様の結果を生成しますが、コマンドがより意味のあるものになる前に実際にテストを行います。
Ankur Chauhan 2013年

5
@AnkurChauhan + 1、dirが存在しない場合、警告が表示されました。
inf3rno 2015

12
これは質問に対する答えではありません。
xpto 2017年

10
上で述べたように、これは答えではありません。削除する前にテストする理由の1つは、Jenkinsジョブ内です。ディレクトリが存在せず、削除しようとすると、ジョブは失敗します。事前にチェックすることをお勧めします。
2017年

8
これが正解だと思います。つまり、@ remoが必要とすることを実行します。つまり、ディレクトリが存在する場合にのみディレクトリを削除し、存在しない場合はエラーを出しません。たぶん、このコマンドが気にしないときに存在を確認する必要があるので、質問はあまりうまくいきません。
pedram bashiri

32

試してください:

bash -c '[ -d my_mystery_dirname ] && run_this_command'

編集:これは、リモートマシンでbashを実行できる場合に機能します。

編集2:bashで、[ -d something ]「何か」というディレクトリがあるかどうかを確認し、ディレクトリが存在する場合は成功コードを返します。&&を使用してコマンドをチェーンすると、最初のコマンドが成功した場合にのみ、2番目のコマンドが実行されます。したがって[ -d somedir ] && command、ディレクトリが存在する場合にのみコマンドを実行します。


はい、それをシェルで試して、希望どおりであることを確認してください。
sinelaw、2011年

まず、それがローカルで機能するかどうかを確認し、リモートでコマンドを送信できるかどうかを確認します。「/ test」ディレクトリをチェックするように言っているのを見ていますか.. just [-d / test] && mkdir / test?
レモ

1
ディレクトリが存在するかどうかを確認し、存在する場合は作成しようとするため、存在する場合はエラーが表示されます。それは私のために何をするかです(ちょうどテストされました)。ディレクトリを作成するべきではありません。削除したいので、おそらく必要です:([ -d /test ] && rmdir /testまたは、空ではなく、すべての内容を削除したい場合は、rm -rf / test)
sinelaw

@SineLaw:注-ディレクトリが存在し、ディレクトリを作成しようとしても、エラーにはなりませんでした。(もう一度テストしました)。しかし、DELETEの場合は機能します。そのことを再確認してください
remo

sharma:bashを使っていますか?「echo $ SHELL」は何と言いますか?
sinelaw 2011年

0

ここに別のライナーがあります:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • &&は、前のステートメントが正常に実行された(終了コード0が返された)場合にのみ、次のステートメントを実行することを意味します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.