ファイルが欠落している場合、rmは報告しませんか?


38

さまざまなディレクトリからファイルを削除するbashスクリプトがあります。しばしば、彼らは生成されなかったのでそこにいません、それは問題ありません。そのエラーを報告しないようにスクリプトを取得する方法はありますが、rmがそれを報告する他の出力を持っている場合は?

あるいは、ノイズの少ないファイルを削除するために使用するより良いコマンドがありますか?

回答:


65

-fオプションを使用します。存在しないファイルを静かに無視します。

からman rm

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

[「プロンプトなし」の部分は、(a)-f以前に指定されたオプション-iまたは-Iオプションをオーバーライドし、(b)書き込み保護されたファイルは確認せずに削除されることを意味します。]

がなければ-frmファイルが見つからないことについて文句を言うでしょう:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

-f、それは沈黙します:

$ rm -f nonesuch
$

4
ああ、削除のプロンプトを表示せず、存在しないものも無視することに気づかなかったのは新しいです。私は人を見たとき、それを完全にスキップしました。:-) ありがとうございました。許可され次第、これを回答としてマークします。
フリッカーフライ

9

あなたの要件がrmファイルの欠落について文句を言わないが、からの他の出力も必要とする場合rm、私の提案は、ターゲットファイルの存在を最初にテストし、ファイルが実際に存在する場合にのみrm(フラグなし-f)呼び出すことです。

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

rm -fたとえば、ユーザー書き込み権限がないファイルを呼び出すと、ファイルが削除されますし、また、そのシナリオの通常のプロンプトを放出しません。

同じアイデアを複数のファイルで使用したい場合、次のような関数定義を作成します。

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

次のように使用します。 qrm file1 file2-does-not-exist *.txt etc here


1
テストと削除の間にファイルが削除(または作成)される競合状態のごくわずかな可能性に注意する価値がありますが、シェルスクリプトを使用する一般的な状況に関連することは想像できません。
デビッドZ

7

rmコマンドを実行するとき、コマンドから他の出力を見たいと述べましたが、-fオプションを使用すると、それらを抑制します。STDERRをフィルタリングして必要なものを見つける必要がありますが、他のすべてを表示したい場合は少し注意が必要です。

次のようなコマンドを使用します。

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

コマンドの説明:

  • -f 引数は確認またはエラーのプロンプトではなく、強制的に通過することです
  • 3>&1 1>&2 2>&3 3>&-フィルタリングのためにSTDOUTとSTDERRを切り替えることです(詳細についてはこちらをご覧ください応じ
  • | grep -v 'No such file or directory' 表示したくないメッセージを除外しています

これで、エラーメッセージを完全に抑制したい場合は、次のコマンドを実行できます。

rm filename 2> /dev/null

このコマンドは、STDERRを/ dev / nullにリダイレクトするため、コマンドを実行しても表示されません。


1
(AFAICS)stdoutには出力rmせず-v、stderrのみであるため、この場合2>&1 | grepは、より一般的に有用なダンスなしで実行できます
。– dave_thompson_085

4

別の方法として、オプションを指定してfindコマンドを使用でき-deleteます。これは(明らかに)見つかったファイルのみを削除するので、ファイルがない場合は警告しません。例は次のとおりです。

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

/var/log/triffids/ディレクトリを検索し、.log30日以上変更されていない接尾辞を持つすべてのファイルを削除します。

これらのコマンドを実行することは常に良い考えであるなし-deleteを確認してください、それはあなたが期待するファイルを見つけることだ作るために、最初のオプション。


私はこのオプションが好きで、変更を検討します。共有してくれてありがとう。
フリッカーフライ

3

次の--force-f)オプションを確認しますrm

-f、-force

存在しないファイルと引数を無視し、プロンプトを表示しない


2

これはハッキングですが、いつtouchでもファイルを削除しようとしていました。存在しない場合は作成されるため、rm削除できます。


パフォーマンスを除いて、私はこれが好きです-存在しないファイルだけを削除するのとは対照的に、数Kのファイルに触れることはどれくらい費用がかかりますか?
Dani_l

0

-fmanページによると、そのまま使用できます。

ファイルの許可に関係なく、確認を求めずにファイルを削除しようとします。ファイルが存在しない場合は、診断メッセージを表示したり、エラーを反映するために終了ステータスを変更したりしないでください。-fオプションは、以前の-iオプションをオーバーライドすることも覚えておいてください。

rm -f xyz-directory

何も促されず、あなたが望むことを正確に行います。


-1

主に2つの方法があります:-fオプションを追加した場合、「存在しない」エラーは表示されません。 / null "ここで、" thecommand "は実行しているコマンドです。


1
発生する可能性のある他のエラーを失いたくないので、パイピングを避けていました。彼らがどうなるかわかりません。
フリッカーフライ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.