保護されたファイルを削除するときに「y」を複数回発行する必要がないようにする方法

保護されたファイルを削除するときに「y」を複数回発行する必要がないようにする方法

「rm:書き込み禁止の一般ファイル[x]を削除しますか?」への回答を探しています。

bashrcから文字を複数回エクスポートし、キャリッジリターンを複数回エクスポートしようとしています。私たちは何をすべきですか?

答え1

更新された質問に基づいて修正:

ファイルを削除するかどうかを尋ねるメッセージを表示したくない場合は、-f(「force」)オプションを追加してください。

rm -f /path/to/file

これには副作用があることに注意してください。指定されたパスが存在しない場合、そのパスはいいえこれを報告すると正常に返されます。

$ rm -f /nonexistent/path
$ echo $?
0

元の答え:

簡単な解決策は次のとおりです。

yes "$string" | head -n $number | tr $'\n' $'\r'

yes改行で区切って、ユーザーが提供した文字列を無限に繰り返します。複数回使用したhead後に停止し$numbertr改行文字をキャリッジリターンに変換します。キャリッジリターンによって出力が表示されない場合がありますが、それを次のコマンド(bash)に渡すと説明されます。

printf %q "$(yes "$string" | head -n $number | tr $'\n' $'\r')"

ないユーザーはbash結果にパイプするodか、返された実際の文字を表示できますhexdumpxxd

答え2

rm質問するようにハードコードされています。インタラクティブに書き込み禁止ファイルについて。 「インタラクティブ」とは、質問を印刷してからユーザー入力を待つことを意味します。

質問を防ぐ方法は2つありますrm

rm -rf somedir
     ^

そして

rm -r --interactive=never somedir
      ^^^^^^^^^^^^^^^^^^^

-r(どちらもディレクトリの代わりにファイルを削除しても機能します)

説明する:

-frm「存在しないファイルとパラメータを無視してメッセージを表示しない」を有効にします。

--interactive=never説教することをしなさい: 決して相互作用しないで下さい。つまり、プロンプトを表示しません。

-fとの違いは、--interactive=never「存在しないファイルと引数を無視する」部分です。

比較する:

$ rm -rf nonexistingname
$ echo $?
0

そして

$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1

rm対話をしたくないが、それでもエラーを処理したいスクリプトを書くときの違いは主に興味深いです。

要約:コマンドラインで使用されますrm -rfrm -r --interactive=never


ボーナス:スクリプト中で削除したいファイル名が外部から来た場合は、奇妙なファイル名と悪意のある入力を防ぐために衛生対策を講じる必要があります。

rm -r --interactive=never -- "./$filename"

重要な部分:--ダッシュで始まるファイル名を回避するには、オプションの末尾を二重ダッシュ()でマークし、ファイル名にスペースを含めないようにするには、引用符を使用してファイル名がダッシュ./で始まるのを二重に防止し、すべてのファイルを強制します。適用するには、ドットスラッシュ()を使用してください。作業ディレクトリ。

詳しくはこちらをご覧ください。https://www.cyberciti.biz/faq/unix-linux-remove-strange-names-files/


指定された質問(「保護されたファイルを削除するときに「y」を複数回実行しない方法」)への回答については、次を参照してください。https://askubuntu.com/questions/338857/automatically-enter-input-in-command-line/338860#338860

答え3

私が時々経験するもう一つの問題は、/etc/bashrcに次のrmエイリアスがあることです:rm -i

alias rm='rm -i'

この場合、エイリアスunalias rmが指定されたコマンドの前にバックスラッシュを配置してエイリアスを一度無視するために、数年前に私が見つけたこのトリックを使用することもできます。たとえば、次のようになります。

\rm somefile

次の記事では、エイリアスの詳細を学ぶことができます。ニッククラフト

答え4

私も同じ問題に直面しました。上記の答えは1つのファイルにのみ適用されますが、多くのファイルを無視する場合は例です。

あなたはそれを使用することができます

sudo rm -r /path/to/directory

書き込み禁止の一般ファイルをすべて削除

関連情報