iノードを使用してファイルまたはディレクトリの名前を変更することは可能ですか?


10

/ homeディレクトリを別のパーティションに変更し、そこからファイルにアクセスできませんでした。この質問から解決できたことです - 別のパーティションに切り替えた後、以前のマウントの内容にどのようにアクセスしますか?

以前にディレクトリのiノードをメモしていた場合、それだけでディレクトリの名前を変更できますか?

回答:


6

を使用してiノードの知識のみを使用してファイル(ディレクトリなど)の名前を変更できますfindが、(a)ファイルを含むファイルシステムがマウントされていない場合、または(b)を含む空でないディレクトリに別のファイルシステムがマウントされている場合あなたが興味のあるファイル、ファイルはあなたのシステムから単にアクセスできません。(a)の場合、ファイル名を変更するなど、内容を変更する前にファイルシステムをマウントする必要があります。(b)の場合は、ファイルシステムを含むディレクトリの「上に」マウントされているファイルシステムをアンマウントする必要があります。名前を変更するファイル。ケース(b)について質問しているようです。

私があなたを正しく理解している場合は、古い/homeパーティション(ルートパーティションにあります)にアクセスできるようにしている一方で、にマウントされている新しいパーティションを使用しています/home。それが必要な場合は、次の操作を行います。

すべてのファイルを閉じてログアウトします。次に、としてログインしますroot(このために仮想端末を使用します— Ctrl-Alt-F2を押します)以下を実行します。

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old

すべてが順調である場合は、ログアウトして、自分自身として再度ログインします。すべて問題ありません。

ちなみに、inodeの情報のみを使用してファイルの名前を変更するコマンド(ファイルが現在のディレクトリにあると想定)は次のとおりです。

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;

123456789もちろん、iノード番号はどこにありますか。(注findファイル名とそのパスを決定し、この情報を渡しmv、そこにせずにファイルの名前を変更するには、すべての方法はありません関与する任意の方法で既存のファイル名は、それはあなたがいないということだけだ場合は知っているファイル名を、それはかなりありますシンプル。)


mvコマンドは、iノードに基づいて直接名前を変更できますか?findコマンドはファイル名を通常のテキスト形式で返すと思います。
vfclists 2015年

@vfclists:いいえ、mvどのような方法でもiノードを受け入れません。
ワイルドカード

6

典型的なUnixファイルシステムでは、一般にiノードに基づいてファイルを移動することは構造的に不可能です。その理由は、ファイルの名前を変更すると、そのファイルを含むディレクトリからそのディレクトリエントリが削除され、別の場所にディレクトリが作成されることになります。ただし、inodeにはディレクトリエントリへのポインタは含まれず、ファイルメタデータ(タイムスタンプ、権限など)とファイルの内容(ポインタ)のみが含まれます。

複数のハードリンクを持つファイルの場合、名前を変更するのは次のうちどれですか。iノードだけでは十分な情報ではありません。

ディレクトリの場合、一部のファイルシステムでは、inodeのみを指定して動作することができます。

  1. iノードから確実に到達できるディレクトリの内容を読み取ります。
  2. のディレクトリエントリを見つけます..。これは親ディレクトリを指します。
  3. 親ディレクトリで、正しいiノード番号のディレクトリエントリを探します。

ただし、これにはいくつかの前提があります。

  • 同じiノードに複数のエントリがある場合はどうなりますか?実際、それは問題ではありません。UNIXのほとんどのバリアントは、ディレクトリへの明示的なハードリンクを禁止しているため、実際にはほとんど起こりません。
  • ない..最初の場所に存在しますか?これはファイルシステムのタイプに依存します。一部のファイルシステムには、の明示的なエントリがあり..ます。その他の場合、これらのエントリはファイルシステムドライバによって偽造されます。場合は..存在しない、このアプローチは基本的に不可能です。
  • ファイルシステムに..リンクが含まれている場合でも、明白ではないかもしれない別の障害があります。ステップ1はカーネル内部で可能かもしれませんが、そのためのインターフェースがありません。多くのUNIXバリアントには、inodeを介してファイルを開くことができるインターフェースがありません。これは、パーミッションをバイパスするためです。たとえば、アクセス権rwxr-xr-x(つまり、そのファイルのrwx------所有者だけがアクセスできる)のディレクトリにあるアクセス権(つまり、誰でも読み取り可能)のあるファイルは、ディレクトリの所有者以外はアクセスできません。これは、iノードだけから判断することはできません。ファイルは実際には別のハードリンクを介してアクセスできます。

結局のところ、いいえ、ファイルのiノードのみが指定されているファイルでは、名前の変更を含め、何も実行できません。ファイルへのパスが必要です。

iノードを指定してファイルを操作する唯一の実用的な方法は、最初に、たとえばをfind -inum使用してパスを見つけ、次にそのパスを使用して操作することです。これは、ファイルがマウントポイントによってシャドウされている状況では役に立ちません。マウントポイントによって隠されているファイルにアクセスするポータブルな方法はありません。Linuxでは、ご存じのとおり、バインドマウントを使用できます。


-1

ありがとうございました。これは非常に役に立ちました。YouTubeからダウンロードしたビデオファイルのトランスクリプトの面倒な名前を、より簡潔でありながら意味のあるファイル名に変更できます。例えば:

you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs

...私にファイルを与えます:

20191129_tucker.webm; および「Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox Newsを救う2019年11月29日en.srt」

これは、他の点では非常に便利なあなたが手に入れることの欠点であると私は考えています。

次のように2番目のファイル名を変更できます。

$ ls -il "Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 2019年11月29日、en.srtの節約"

...これにより、最初にiノード番号が記載されたファイルリストが表示されます。

13902671 -rw-r--r-- 1 james james 55793998 Nov 30 18:44 Saving Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 11月29、2019.en.srt

...それから私は走ります:

mvi 13902671 20191129_tucker.srt

私のmvi bashシェルスクリプトは次のとおりです。

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;

これは、以前に言及したものを超える新しい情報を追加しません。さらに、mviスクリプトは引用符で囲まれていない変数を使用します。つまり、スクリプトに指定された引数のいずれかに空白文字が含まれている場合(またはグロブ文字が含まれている場合もある)、失敗します。
クサラナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.