保護されたフォルダ/var/log/nginx
(ルートが所有し、他の誰も読み書きできないフォルダ)があるとします。sudo を使用しても、sudo rm -f /var/log/nginx/ab*
「そのようなファイルまたはディレクトリはありません」というメッセージが表示されずにはいられません。これを行うには、実際にルート シェルをロードする必要がありますか、それとも他の方法がありますか?
答え1
原因
シェルは、アスタリスクなどの glob 文字 (ワイルドカード) を解釈して展開します。このコマンドの解釈は、sudo
ディレクトリの読み取り権限を持たない現在のシェル (コマンドの実行前) で行われます。現在のシェルは glob パターンに一致するファイルを見つけられないため、パス名の展開は実行されず、シェルはrm
、、、-f
および/var/log/nginx/ab*
(リテラルのアスタリスク付き) をコマンドの引数として渡しますsudo
。
コマンドsudo
は、パス(アスタリスクはUnixファイル名の有効な文字)rm
のファイルを削除しようとするコマンドを起動します。そのようなファイルは実際には存在しないため、失敗を報告します。GNUでは、このエラーメッセージは明示的です。/var/log/nginx/ab*
rm
満杯以下のエラー メッセージは、削除される (単一の) ファイルが存在しないことを示しています。
rm: cannot remove `/var/log/nginx/ab*': No such file or directory
解決
解決策は、ファイル名の拡張を実行するために必要な権限を持つスーパーユーザーとして新しいシェルを起動することです。
sudo bash -c "rm -f /var/log/nginx/ab*"
上記のコマンドは、ルートとして実行される新しいシェルを起動し、-c
オプションを使用してシェルで実行されるコマンドを渡します。コマンドは引用符で囲まれているため、アスタリスクは現在のシェルによって解釈されず、そのまま新しいルート シェルに渡され、コマンドを起動する前にパス名を展開できますrm
。
答え2
ファイル名に問題があるか、ファイル名にスペースが含まれている可能性があります。
したがって、次の回避策を試してください。
--
オプションの終了を示すには、preceed を試してください。例:sudo rm -vf -- /var/log/nginx/ab*
使用
find
:sudo find /var/log/nginx -name "ab*" -print -delete
Linux 上でファイルが保護されていると思われる場合は、まず保護を解除してみてください。
chattr -i ab*