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


답변:


6

를 사용하여 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하지 않고 파일의 이름을 변경하는 전혀 방법이 없다 관련된 어떤 식 으로든 기존의 파일 이름,하지만 당신이하지 않는 것이 단지 있는지 알고 파일 이름을, 그것은 아주이다 단순한.)


mv 명령이 inode를 기반으로 직접 이름을 바꿀 수 있습니까? find 명령은 파일 이름을 일반적인 텍스트 형식으로 반환한다고 가정합니다.
vfclists 2016 년

@vfclists : 아니요, mv어떤 식 으로든 inode를 허용하지 않습니다.
와일드 카드

6

일반적인 Unix 파일 시스템에서는 일반적으로 inode를 기반으로 파일을 이동하는 것이 구조적으로 불가능합니다. 파일 이름을 바꾸면 파일을 포함하는 디렉토리에서 디렉토리 항목을 제거하고 다른 곳에 디렉토리를 작성해야합니다. 그러나 inode에는 디렉토리 항목에 대한 포인터가 없으며 파일 메타 데이터 (타임 스탬프, 권한 등)와 파일 내용 만 포함합니다.

하드 링크가 여러 개인 파일의 이름을 바꾸려면? 아이 노드 정보가 충분하지 않습니다.

디렉토리의 경우, 일부 파일 시스템에서 inode 만 제공하면 작동 할 수 있습니다.

  1. inode에서 도달 할 수있는 디렉토리의 내용을 읽으십시오.
  2. 의 디렉토리 항목을 찾으십시오 ... 이것은 상위 디렉토리를 가리 킵니다.
  3. 상위 디렉토리에서 올바른 inode 번호가있는 디렉토리 항목을 찾으십시오.

그러나 이것은 몇 가지 가정을합니다.

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

결론은 아니요, 이름 변경을 포함하여 inode 만 제공된 파일로는 아무것도 할 수 없다는 것입니다. 파일 경로가 필요합니다.

inode가 주어진 파일에서 실제로 행동하는 유일한 방법은 먼저 find -inum경로를 찾은 다음 경로를 사용하여 행동하는 것입니다. 파일이 마운트 포인트로 음영 처리되는 상황에서는 도움이되지 않습니다. 마운트 포인트로 음영 처리 된 파일에 액세스 할 수있는 이식 가능한 방법은 없습니다. Linux에서 발견 한 바와 같이 바인드 마운트를 사용할 수 있습니다.


-1

감사합니다. 가장 도움이되었습니다. YouTube에서 다운로드 한 비디오 파일의 사본에 대한 성가신 이름을 간결하지만 여전히 의미있는 파일 이름으로 변경할 수 있습니다. 예를 들면 다음과 같습니다.

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

... 파일을 제공합니다.

20191129_tucker.webm; 및 "터커 칼슨 저장 오늘 밤 11-29-19 전체-속보 폭스 뉴스 2019 년 11 월 29 일 .en.srt"

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

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

$ ls -il "터커 칼슨 저장 오늘 밤 11-29-19 전체-속보 폭스 뉴스 2019 년 11 월 29 일 .en.srt"

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

13902671 -rw-r--r-- 1 제임스 제임스 55793998 11 월 30 일 18:44 Tucker Carlson 저장 오늘 밤 11-29-19 전체-Breaking Fox News 2019 년 11 월 29 일 .en.srt

... 그런 다음 :

mvi 13902671 20191129_tucker.srt

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

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

이전에 언급 한 것 이상의 새로운 정보는 추가하지 않습니다. 또한 mvi스크립트는 인용되지 않은 변수를 사용하므로 스크립트에 제공된 인수 중 하나에 공백 문자가 포함되어 있거나 잠재적으로 글러브 문자가 포함되어 있으면 실패합니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.