シェルスクリプト `rm -r`: 書き込み禁止プロンプトをリダイレクトし、"n" で応答します。

シェルスクリプト `rm -r`: 書き込み禁止プロンプトをリダイレクトし、

ディレクトリを繰り返し、いくつかの名前を一致させて削除するシェルスクリプトにはいくつかの行があります。ファイルシステムの特定の領域は書き込み禁止です。これを維持したいのですが、プロンプトやエラーの他の表示をログにリダイレクトしたいと思います。彼らが会うとき。

スクリプトのこの時点で使用すると、rm -r /path/to/directoryスクリプトが出力されます。

rm: descend into write-protected directory /path/to/directory/subdirectory?

そのため、自分のデバイスにそのままにしておくと動作が中断され、[最終的に]タイムアウトします。

プロンプトに "n"を接続してこの動作を修正してみました。

yes n | rm -rv /path/to/directory

これにより、2つの望ましくない結果が生じる。

  1. yes: standard output: Broken pipe; yes: write error各ディレクトリの出力はい削除され、
  2. rm: descend into write-protected...メッセージを標準出力に返さないでください。

これを行う正しい方法は何ですか?

修正する:yes n@roaimaによると、パイプがあればインタラクティブではないので、実際にプロンプ​​トをまったくパイプしませんrm。実際には、いくつかの出力を得るためにインタラクティブ機能を利用していますが、インタラクティブ機能をオフにするとプログラムがエラーで終了するため、これは皮肉です。保護されたファイルの名前が必要なので、エラーを無視したくありません(たとえば、|| trueSEの他の場所で見たように追加)

ベストアンサー1

rmstdinが端末の場合、書き込み不可能な宛先の確認が要求されます。-i一方、確認のためにフラグがオンになります。みんなターゲット。明らかに、これらの方法のどれもにyes nパイプを接続する簡単なソリューションには適していないので、rm他の方法を使用する必要があります。

GNU findを使用して、1つ以上の書き込みモードビットが設定されているすべてのオブジェクトを削除します(通常は最初にテストを実行するので-printはなく最初に使用します-delete)。

find dir/ -perm /0222 -delete

または、書き込みモードビットが1つ以上設定されている(*)ファイルをすべて削除し、書き込み不可能なディレクトリの内容をスキップします。

find . -type d ! -perm /0222 -prune -o ! -type d -perm /0222 -exec rm {} + 

(*実際にディレクトリを除くすべて)

-delete深さ優先検索(少なくともGNU findでは)を意味し、機能しないため、-pruneここでは使用できません。その後、書き込み可能な空のディレクトリを削除できます。

find . -type d -perm /0222 -delete

空でないディレクトリに対してエラーが発生します。

-perm /0222「全ての書込みビットがセットされている」を意味し、反義語は! -perm /0222「書込みビットがセットされていない」である。

他のバージョンの find では、代わりに+0222を使用/0222してください。 (GNUのマニュアルページによると、前者はPOSIXの要件と競合するため、廃止されました。)


書き込み不可能なファイルやディレクトリを見つけるには、同様に使用できます。

find . ! -perm /0222 

書き込み不可能なディレクトリの内容を再帰的に一覧表示するのは少し難しいですが、GNUツールを使用すると次のように動作できます。

find . ! -perm /0222 -print0 | xargs -0 find 

おすすめ記事