web-dev-qa-db-ja.com

ワイルドカードを指定したSudoを使用して、ルート所有のディレクトリからファイルを削除します

フォルダーがあるとしましょう。/var/log/nginx保護されています(rootが所有し、他の誰もそのルートに読み書きできません)。須藤を使ってもSudo rm -f /var/log/nginx/ab*「そのようなファイルまたはディレクトリはありません」を取得せずに。これを行うには、実際にルートシェルをロードする必要がありますか、それとも他の方法がありますか?

2
ffxsam

原因

シェルは、アスタリスクなどのグロブ文字(ワイルドカード)を解釈して展開します。コマンドのこの解釈は、ディレクトリの読み取り権限がない現在のシェル(Sudoコマンドが実行される前)で行われます。現在のシェルはglobパターンに一致するファイルを見つけることができないため、パス名の展開は実行されず、シェルはrm-f、および/var/log/nginx/ab*(リテラルアスタリスク付き)を渡します。 Sudoコマンドの引数として。

次に、Sudoコマンドはrmコマンドを起動し、パスが/var/log/nginx/ab*のファイルを削除しようとします(アスタリスクはUnixファイル名の有効な文字です)。このようなファイルは実際には存在しないため、失敗を報告します。 GNU rmの場合、このエラーメッセージは明示的です。以下のfullエラーメッセージは、削除される(単一の)ファイルが存在しないことを示します。

rm: cannot remove `/var/log/nginx/ab*': No such file or directory

解決

解決策は、ファイル名の展開を実行するために必要な権限を持つスーパーユーザーとして新しいシェルを起動することです。

Sudo bash -c "rm -f /var/log/nginx/ab*"

上記のコマンドは、rootとして実行される新しいシェルを開始し、-cオプションを使用して、シェルによって実行されるコマンドを渡します。コマンドが引用符で囲まれているため、アスタリスクは現在のシェルによって解釈されず、そのまま新しいルートシェルに渡され、rmコマンドを起動する前にパス名を展開できるようになります。

7

ファイル名に問題があるか、ファイル名にスペースが含まれている可能性があります。

したがって、次の回避策を試してください。

  1. 先行してみてください--オプションの終了を示します。例:

    Sudo rm -vf -- /var/log/nginx/ab*
    
  2. findを使用します:

    Sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. Linuxでファイルが保護されていると思われる場合は、最初に保護を解除してみてください。

    chattr -i ab*
    
1
kenorb