inode를 사용하여 파일이나 디렉토리의 이름을 바꿀 수 있습니까?

inode를 사용하여 파일이나 디렉토리의 이름을 바꿀 수 있습니까?

/home 디렉터리를 다른 파티션으로 변경했지만 해당 파티션의 파일에 액세스할 수 없었습니다. 이것이 이 질문에서 해결할 수 있었던 것입니다.다른 파티션으로 전환한 후 이전에 설치한 콘텐츠에 어떻게 액세스합니까?.

이전에 디렉토리의 inode를 적어 둔 경우 이를 단독으로 사용하여 디렉토리 이름을 바꿀 수 있습니까?

답변1

inode에 대한 정보만 사용하여 파일(디렉토리 또는 기타)의 이름을 바꿀 수 있지만 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물론, inode 번호는 어디에 있습니까? ( find파일 이름과 경로를 결정하고 이 정보를 에 전달합니다 mv. 이 정보가 없으면 파일 이름을 전혀 바꿀 수 없습니다.관련된어떤 방식으로든 기존 파일 이름을 사용하지만 그렇게 하지 않는 경우알다파일명은 매우 간단합니다. )

답변2

일반적인 Unix 파일 시스템에서는 일반적으로 inode를 기반으로 파일을 이동하는 것이 구조적으로 불가능합니다. 그 이유는 파일 이름을 바꾸는 것은 파일이 포함된 디렉터리에서 해당 디렉터리 항목을 제거하고 다른 곳에 디렉터리를 만드는 것을 의미하기 때문입니다. 그러나 inode에는 디렉터리 항목에 대한 포인터가 포함되어 있지 않으며 파일 메타데이터(타임스탬프, 권한 등)와 파일 내용만 포함(가리키는)됩니다.

여러 개의 하드 링크가 있는 파일의 경우 그 중 어느 링크의 이름을 바꾸시겠습니까? inode 정보가 부족합니다.

일부 파일 시스템에 있는 디렉터리의 경우 inode만을 기반으로 작동하는 것이 가능합니다.

  1. 디렉토리의 내용을 읽는 것은 inode에서 접근 가능해야 합니다.
  2. 디렉토리 항목을 찾았습니다 ... 이는 상위 디렉터리를 가리킵니다.
  3. 상위 디렉토리에서 올바른 inode 번호가 있는 디렉토리 항목을 찾으십시오.

그러나 이는 다음과 같은 몇 가지 가정을 합니다.

  • 동일한 inode에 여러 항목이 있으면 어떻게 되나요? 실제로 이것은 문제가 되지 않습니다. 대부분의 UNIX 변형은 디렉토리에 대한 명시적인 하드 링크를 금지하기 때문에 실제로는 거의 발생하지 않습니다.
  • ..애초에 존재하는 걸까요? 이는 파일 시스템 유형에 따라 다릅니다. 일부 파일 시스템에는 명시적인 항목이 있고 ..다른 파일 시스템에는 파일 시스템 드라이버에 의해 항목이 위조됩니다. ..존재하지 않는 경우 이 접근 방식은 기본적으로 불가능합니다.
  • 파일 시스템에 링크가 포함되어 있더라도 ..명확하지 않은 또 다른 걸림돌이 있습니다. 즉, 1단계는 커널 내부에서 가능할 수 있지만 이를 위한 인터페이스는 없습니다. 많은 UNIX 변형에는 inode를 통해 파일을 열 수 있는 인터페이스가 없습니다. 이렇게 하면 권한을 우회할 수 있기 때문입니다. 예를 들어, 권한이 있는(즉, 소유자만 액세스할 수 있는 rwxr-xr-x) 디렉터리에 있는 권한(즉, 누구나 읽을 수 있음)이 있는 파일은 rwx------디렉터리 소유자를 제외한 누구도 액세스할 수 없습니다. 이는 inode만으로는 결정할 수 없습니다. 파일은 실제로 다른 하드 링크를 통해 액세스할 수 있습니다!

결과적으로 인덱스 노드만 주어진 파일에서는 이름 바꾸기를 포함한 어떤 작업도 수행할 수 없습니다. 파일 경로가 있어야 합니다.

특정 inode에 대해 파일을 작업하는 유일한 실용적인 방법은 먼저 를 사용하여 경로를 찾은 다음 find -inum해당 경로를 사용하여 작업하는 것입니다. 귀하의 경우에는 도움이 되지 않습니다. 파일이 마운트 지점에 의해 가려져 있습니다. 마운트 지점에 의해 숨겨진 파일에 액세스할 수 있는 이식 가능한 방법은 없습니다. Linux에서는 바인드 마운트를 사용할 수 있습니다.

답변3

감사해요. 이것은 매우 도움이 됩니다. 이를 통해 YouTube에서 다운로드한 비디오 파일 복사본의 번거로운 이름을 더 간결하면서도 의미 있는 이름으로 변경할 수 있었습니다. 예를 들어:

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

...파일을 주세요.

20191129_tucker.webm; 및 "11/29/19 풀 에디션 오늘 밤 Tucker Carlson 구하기 - Fox News 11/29/2019.en.srt"

나는 이것이 매우 유용한 것의 단점이라고 생각합니다.

두 번째 파일 이름을 다음과 같이 변경할 수 있습니다.

$ls -il "오늘밤 터커 칼슨 구하기 11/29/19 풀 에디션 - Fox News 11/29/2019.en.srt"

...이것은 시작 부분에 inode 번호가 있는 파일 목록을 제공합니다.

13902671 -rw-r--r-- 1 james james 55793998 11월 30일 18:44 Saving Tucker Carlson Tonight 19-11-29 Full - Breaking Fox News 2019년 11월 29일 srt

...그런 다음 다음을 실행합니다.

mvi 13902671 20191129_tucker.srt

내 mvi bash 쉘 스크립트는 다음과 같습니다.

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

관련 정보