すでに空の場合、エラーなしでディレクトリ内のファイルを削除します


31

展開スクリプトの一部として、一時ディレクトリからキャッシュされたものをいくつかダンプしたい。私は次のようなコマンドを使用します:

rm /tmp/our_cache/*

ただし、/tmp/our_cacheが空の場合(テストサーバーに多数の変更をすばやく連続してプッシュする場合はかなり一般的です)、次のエラーメッセージが出力されます。

rm: cannot remove `/tmp/our_cache/*': No such file or directory

大したことではありませんが、少しいので、このスクリプトからの出力の信号対雑音比を減らしたいと思います。

ディレクトリが既に空であるというメッセージを表示せずにディレクトリの内容を削除するためのUnixの簡潔な方法は何ですか?

回答:


48

おそらくプロンプトを出さずにすべてのファイルを削除したいので、なぜ-fスイッチを使用してrm存在しないファイルを無視しないのですか?

rm -f /tmp/our_cache/*

manページから:

-f, --force
          ignore nonexistent files, never prompt

また、サブディレクトリが存在する可能性が/tmp/our_cache/あり、それらとそのコンテンツも削除する場合は、-rスイッチを忘れないでください。


3
最も明白な解決策と私はそれについて考えませんでした!この漫画の最初の男のように感じますxkcd.com/399 ;-)
ホイヘンス

6
find /tmp/our_cache/ -mindepth 1 -delete

編集1

「-type f」を削除

編集2

-mindepth 1-type f制限を取り除いた後)検索ルートディレクトリが削除されないようにするために、非標準オプションを追加しました。


-type f一時的なディレクトリも存在する可能性があるため、ご注意ください(質問の例ではそれらを説明していないため、おそらく存在しません...)
Izkata

1
using -type fは通常のファイルのみを削除するため、たとえばシンボリックリンクは削除されません。
ホイヘンス

@rush申し訳ありませんが、私はそれを確認しませんでしたが、ディレクトリについては何も言及せずに、「ファイルを削除」と書かれたマニュアルページを参照しました。コメントを削除します。
ホークレイジング

1
それは/tmp/our_cacheあなたがそうするかもしれないので取り除くrm -r /tmp/our_cache。非標準オプションを使用しているときに、を使用できます-mindepth 1。に反してrm /tmp/our_cache/*、サブディレクトリとそのコンテンツおよび隠しファイルも削除することに注意してください。
ステファンシャゼル

2

/dev/nullこれを印刷しないように標準エラーをリダイレクトできます

$  rm /tmp/our_cache/* 2>/dev/null

2
これは、たとえば、使用中のファイルを削除できない場合に表示されるエラーも抑制しませんか?抑制したい唯一のエラーは、ターゲットディレクトリが空の場合に表示されるエラーです。これは、望ましくない副作用があるようです。
マークアメリー

何らかのプロセスが開いたファイルを削除しようとしても、エラーは発生しません。
pradeepchhetri

1

別の方法(ただし、少しやり過ぎ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

これは、ディレクトリでを実行して返される文字列が空でないかどうtest[をテストするために使用lsします。次に、その文字列が空でない場合にのみ、ディレクトリの下のすべてを削除します。

注:グロブを除外すると、lsファイルなしのエラーが抑制されます。


-1

スクリプトがBASHで使用されている場合は、次を試すことができます。

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

「実際の」問題がある場合、またはファイルが保護されている場合(このタイプのファイルを削除するには-f修飾子が必要rm)、エラーが発生しますが、ファイルがない場合はエラーが回避されます。

スクリプトにBASH以外のシェル(zsh、kshなど)を使用する場合、より移植性の高いこの他の構文を試すことができます。

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.