Linuxでiノード番号を使用してファイルを削除する


14

UNIX / Linuxでのような特殊文字を使用してファイルを作成する場合touch \"la*、で削除することはできませんrm "la*。iノード番号を使用する必要があります(\名前の前にiノード番号を追加することはできますが、ファイル作成で使用されたことをユーザーとして推測する必要があります)。

rmのマンページを確認しましたが、inode番号については言及していません。行うこともrm inodenumber機能しません。

このコマンドは何ですか?

回答:


23

他のいくつかの方法が含まれます:

特殊文字のエスケープ:

[〜] $ rm \ "la \ *

findコマンドを使用して、現在のディレクトリのみを検索します。findコマンドはiノード番号を検索でき、便利な-deleteスイッチがあります:

[〜] $ ls -i
7404301 "la *

[〜] $ find -maxdepth 1 -type f -inum 7404301
./"la*

[〜] $ find -maxdepth 1 -type f -inum 7404301 -delete
[〜] $ ls -i
[〜] $

確かに、findを使用することは、私の提案よりも確かに簡単だと思います-inum :)

Findには探索すべき素晴らしいスイッチがたくさんあります。正直に言うと、スイスアーミーナイフツールです:)
ジョンT

t:そうそう。
アキラ

Solarisには、「-maxdepth」オプションの「-delete」がありません。
ガスリー14

-xdev他のマウントされたファイルシステムにも同じiノード番号を持つ無関係のファイルがある可能性があるため、オプションを使用して検索を制限する必要があります。
ジョナスベルリン

5

たぶん私は何かを見逃していますが...

rm '"la*'

とにかく、ファイル名にはiノードがありませんが、ファイルにはあります。ファイルを指すすべてのファイル名を削除せずにファイルを削除しようとすると、ファイルシステムが破損します。


まあ、これは現在のディレクトリでのみ機能しますが、実際には懸念の有効な原因です。私はそれを見逃したことは愚かです。それでもファイルは削除されません。
KdgDev

3
もちろん違います。ファイルは、それを指しているファイル名がなく、ファイルを開いているプロセスがないときにのみ削除されます。
イグナシオバスケス-エイブラムス

5

あなたが本当にこれをやりたいなら、そしてあなたのユースケースが本当に必要なように見えないなら、あなたはファイルシステムデバッグツールを試すかもしれません。あなたがすべてを失うことをいとわないなら、それはそうです。

たとえば、ext2 / debugfs3/4の場合、コマンドにはiノードを取るように見える「kill_file」オプションがあります。他の応答で述べたように、これ存在しないファイルを指すディレクトリエントリがあるため、ファイルシステムに損傷を与えます。fsck後で実行すると、これを修復できる場合があります。マウントされたファイルシステムでこれを行うことはできません。

しかし、適切なエスケープ/引用を使用し、以前の応答で述べたように通常のコマンドでそのようなファイルを削除することを強くお勧めしますrm- rm -i*


1

「特殊文字をエスケープする」アプローチを強くお勧めしclriますが、修正可能なファイルシステムの破損が本当に必要な場合は常にコマンドがあります。


2
clri通常、Oracleシステム(SunOSなど)にのみ存在することに注意してください。
can-ned_food


1

私が抱えていた課題は、ダッシュで始まるファイル名を削除することでした-rmは常にホスト名として解釈したいのです。私はこれを使用して解決しました:

rm ./-g4xxx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.