inode 번호를 사용하여 파일을 복사하는 방법은 무엇입니까?

inode 번호를 사용하여 파일을 복사하는 방법은 무엇입니까?

이 질문은 Samba와 관련이 있으며 inode는 필요하지 않습니다.


특수 문자가 포함된 파일을 처리하는 데 문제가 있습니다. 그것을 눌러 검색하면 inode파일이 나열됩니다.

 $ find . -inum 90505400 -exec ls {} \;
./12 String Quartet No. 16 in F Major Op. 135: Der schwer gefa?te Entschlu?: Grave, ma non troppo tratto (Mu? es sein ?) - Allegro (Es mu? sein !).flac

그러나 파일에서 또는 을 계속 사용하면 cp오류가 발생합니다(독일어로 "Datei oder Verzeichnis nicht gefunden").rmfile not found

 $ find . -inum 90505400 -exec cp {} ne.flac \;
cp: './12 String Quartet No. 16 in F Major Op. 135: Der schwer gefa?te Entschlu?: Grave, ma non troppo tratto (Mu? es sein ?) - Allegro (Es mu? sein !).flac' kann nicht zum Lesen geöffnet werden: Datei oder Verzeichnis nicht gefunden

파일을 복사하기 위해 inode를 직접 사용하는 다른 명령을 사용할 수 있는지 궁금합니다. 나도 한동안 이 문제를 겪었다. 를 사용하여 모든 파일을 삭제할 수 있지만 rm *손상된 파일 이름을 수정하고 싶습니다.


이것은 ext4다음 줄을 사용하여 외부 USB HDD에서 Raspi에 마운트한 파일 시스템입니다(난독화된 경로 및 IP 변경됨).

UUID=e3f9d42a-9703-4e47-9185-33be24b81c46   /mnt/test   ext4    rw,auto,defaults,nofail,x-systemd.device-timeout=15 0 2

그런 다음 삼바를 사용하여 다음을 공유합니다.

[mybook]
path=/mnt/test
public = yes
browseable = yes
writeable = yes
comment = test
printable = no
guest ok = no

Lubuntu 16에 설치했습니다.

//192.168.1.190/test         /home/ben/test               cifs auto,nofail,username=XXX,password=XXX,uid=1000,gid=1000

VNCMacbook을 통해 Lubuntu 16에 연결되어 있습니다. 아니면 SSH그냥 들어갈게요. 나는 단지 완전한 정보를 얻으라고 말하는 것뿐입니다.

또한 Finder에서 이 Macbook(및 기타)의 공유를 마운트했습니다. Finder가 파일 이름을 올바르게 표시할 수 없습니다.

여기에 이미지 설명을 입력하세요.


한 사용자로부터 도움이 되는 의견을 들은 후 호스트의 파일을 조작하려면 삼바를 통해 파일을 조작하는 대신 원시 파일 시스템을 사용해야 한다는 것을 깨달았습니다.

SSH0xF022호스트를 입력하면 다음 파일 이름이 표시됩니다( "135" 뒤의 기호 참조 ).

'12 String Quartet No. 16 in F Major Op. 135 Der schwer gefa?te Entschlu? Grave, ma non troppo tratto (Mu? es sein ) - Allegro (Es mu? sein !).flac'

cp그런 다음 호스트 자체에 파일을 복사 할 수 있습니다 .

(파일 이름을 어떻게 얻었는지 궁금하신 분은 요약 flac파일과 해당 cue시트를 별도의 파일로 분할하여 자동으로 이름을 지정했습니다.)

답변1

open()(복사) rename(), (삭제) 모두 unlink()파일명으로 이루어집니다. .debugfs

를 사용하여 파일을 삭제할 수 있는 경우 을 사용하여 이름을 바꾸 거나 을 사용하여 파일을 복사 rm *할 수 있습니다 . 해당 파일만 일치한다고 가정합니다. 그 자체로는 아무런 차이가 없어야 합니다.mv ./12* someothername.flaccp ./12* newfile.flac./12*find

하지만 Mac에 대해 언급하셨는데, Mac에서는 파일 이름이 유효한 UTF-8이어야 한다고 생각합니다. 이는 파일 이름이 손상된 경우 문제를 일으킬 수 있습니다. Linux는 잘못된 UTF-8의 이름을 지정하지 않지만 물론 일부 도구는 이상하게 반응할 수 있습니다. (아직 테스트하지 않았습니다.) Samba도 도움이 되지 않을 수 있습니다.

이것이 문제와 관련이 있다고 가정하면 파일 시스템을 사용하여 호스트에 SSH를 연결하고 중간 부분을 건너뛰고 거기에서 파일 이름을 바꿀 수 있습니다.

답변2

해당 inode를 통해 파일을 열 수 없습니다. inode를 통해 파일을 열면 권한이 우회되므로 이는 운영 체제 설계의 의도적인 측면입니다.

호출은 find . -inum $inode_number -exec … {} \;해당 inode를 기반으로 하는 파일 작업에 가장 가깝습니다. 그러나 이는 파일 이름을 사용하며 버그 없는 시스템에서 작동이 보장됩니다.

출력은 ?유효한 문자를 구성하지 않는 바이트를 나타냅니다. 아마도 UTF-8이 필요한 도구에 레거시 8비트 인코딩을 제공하는 소프트웨어가 있을 것입니다.

이것이 잘못 인코딩된 파일 이름을 사용하는 macOS 도구의 증상인지 확실하지 않습니다. 만일을 대비해 C 로캘에서 명령을 실행해 보세요. 이는 모든 파일 이름이 바이트 시퀀스로 처리되므로 유효하지 않은 문자가 없음을 의미합니다(사용자 공간 도구에 관한 한 - 원격 서버가 잘못된 데이터를 제공하면 커널에 여전히 문제가 있을 수 있음).

LC_ALL=C find . -inum 90505400 -exec cp {} ne.flac \;

시도해 볼 수 있는 또 다른 방법은 export LC_ALL=Crun을 입력한 다음 마침을 mv 12누르는 것입니다 Tab.

이것이 작동하지 않으면 문제는 파일을 열라는 지시를 받을 때와 파일의 메타데이터를 검색하라는 지시를 받을 때 다르게 반응하는 결함이 있는 파일 시스템입니다. 이는 Samba 클라이언트 또는 Samba 서버의 버그이거나 구성 오류일 수 있습니다. 또는 Samba가 UTF-8로 완전히 구성되어 UTF-8로 인코딩되지 않은 서버의 파일 이름을 처리할 수 없습니다. 파일 이름이 UTF-8로 인코딩되었는지 서버에서 확인하는 것이 좋습니다. 그렇지 않은 경우 서버에서 이름을 바꾸십시오. 그렇다면 Samba 구성에 문제가 있는 것입니다.

관련 정보