GNU coreutils 8.12.197-032bb ページでは、man
またはオプションを「存在しないファイルを無視してメッセージを表示しない」と説明します。このオプションがない場合、既存のファイルはすべて削除され、メッセージは表示されず、指定されたファイルがない場合はゼロ以外の終了コードが返されます。私の考えではrm
-f
--force
次の場合はファイルをアーカイブしてください。どの指定したファイルが存在しません。これを行う最も簡単な方法は何ですか?
ユースケースは安全:存在しないファイルを削除しようとすると、コマンドに誤った期待(または単純エラー)があるためです。例えば有名なrm -rf /usr /lib/nvidia-current/xorg/xorg
これはいくつかの方法で回避できます。そのうちの1つはこのようなオプションであり(明らかにユーザーが驚くべき偶然の一致でディレクトリを持っていない限り/lib/nvidia-current/xorg/xorg
)、もう1つは次のようになります。より多くの引用を使用™。しかし、引用だけでは十分ではありません。たとえば、次の点を考慮してくださいssh host '/bin/rm some paths; /bin/bash foo.sh'
。セミコロンを忘れたり、他のほぼすべての記号(コロンやコンマなど)を挿入したり、/bin/bash
削除されます~/foo.sh
。
答え1
私は次のようなものを使用します:
mkdir DELETE && mv "some" "paths" DELETE && rm -rf DELETE
シングルパスの場合:
mv /some/path DELETE && rm -rf DELETE
rm command
より良い方法は、別のコマンドラインに次のように入力することですmv /some/path DELETE
Enter rm -rf DELETE
Enter。これにより、rm
シェル履歴に書き込まれる唯一のコマンドはという名前のファイルであるため、以前のバージョンのファイルを削除した場合は、誤って誤った回数をクリックして新しいバージョンを削除することはDELETE
ありません。UpEnter
少し自動化したい場合:
mv_to_DELETE () {
mkdir DELETE &&
mv -- "$@" DELETE/
}
mv_to_DELETE "some" "paths"
rm -rf DELETE
答え2
それはまるで
paths=("some" "paths")
for path in "${paths[@]}"
do
[ -e "$path" ] || exit 1
done
まず、rm
各コマンドの前のコマンドははるかに複雑で、Bash 配列によって異なります。
答え3
for path in "some" "paths"
do
[ -e "$path" ] || exit 1
done
移植性は高いですが、ループとコマンドのパスリストをコピーすることを意味しますrm
。すべてのパスを同じ文字列変数に保存することは、スクリプトがIFS
ファイル名のどの文字もサポートしなくなることを意味します。