Este problema está relacionado ao Samba e os inodes não são necessários.
Estou com um problema ao lidar com um determinado arquivo que contém alguns caracteres especiais. Se eu pesquisar pelo seu inode
, ele listará o arquivo:
$ 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
No entanto, se eu continuar a usar cp
ou rm
no arquivo, ele gerará um file not found
erro (em alemão 'Datei oder Verzeichnis nicht gefunden'):
$ 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
Gostaria de saber se posso copiar o arquivo com outro comando que use o inode diretamente. Eu também tive esse problema há algum tempo. Posso remover todos os arquivos com rm *
, mas gostaria de corrigir o nome do arquivo quebrado.
É um sistema de ext4
arquivos que eu montei em um Raspi a partir de um HDD USB externo com esta linha (caminhos e IPs ofuscados alterados):
UUID=e3f9d42a-9703-4e47-9185-33be24b81c46 /mnt/test ext4 rw,auto,defaults,nofail,x-systemd.device-timeout=15 0 2
Eu então compartilho com o samba:
[mybook]
path=/mnt/test
public = yes
browseable = yes
writeable = yes
comment = test
printable = no
guest ok = no
E eu montei isso em um Lubuntu 16 com isso:
//192.168.1.190/test /home/ben/test cifs auto,nofail,username=XXX,password=XXX,uid=1000,gid=1000
Eu me conecto ao Lubuntu 16 através VNC
de um Macbook. Ou eu SSH
diretamente para ele. Estou apenas dizendo isso para obter informações completas.
Também monto o compartilhamento nesse Macbook (e outros) no Finder. O Finder não exibe o nome do arquivo corretamente.
Após um comentário útil de um usuário, percebi que deveria tentar manipular o arquivo no host com o sistema de arquivos original em vez de tentar fazê-lo sobre o samba.
SSH
ing no host revela este nome de arquivo (veja o sinal 0xF022
após '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'
Consegui então copiar o arquivo cp
no próprio host.
(Caso alguém se pergunte como cheguei ao nome do arquivo: divido um flac
arquivo resumido com sua cue
planilha nos arquivos separados e eles foram nomeados automaticamente.)
Todos
open()
(para cópia)rename()
eunlink()
(remoção) funcionam por nomes de arquivos. Não há realmente nada que funcione diretamente em um inode, além de ferramentas de baixo nível comodebugfs
.Se você puder remover o arquivo com
rm *
, poderá renomeá-lo commv ./12* someothername.flac
, ou copiá-lo comcp ./12* newfile.flac
(supondo./12*
que corresponda apenas a esse arquivo).find
em si não deveria ser tão diferente.Mas você mencionou o Mac, e acho que o Mac exige que os nomes dos arquivos sejam UTF-8 válidos e isso pode causar problemas se os nomes dos arquivos estiverem quebrados. O Linux não nomeia UTF-8 inválido, mas é claro que também algumas ferramentas podem reagir de forma estranha. (Eu não testei.) Ter o Samba lá também pode não ajudar.
Supondo que isso tenha algo a ver com o problema, você pode tentar SSH no host com o sistema de arquivos, pulando as partes intermediárias e renomeando os arquivos lá.
Não é possível abrir um arquivo através de seu inode. Este é um aspecto deliberado do design do sistema operacional, porque abrir um arquivo por meio de seu inode ignoraria as permissões.
Chamar
find . -inum $inode_number -exec … {} \;
é o mais próximo possível de agir em um arquivo com base em seu inode. Mas isso usa o nome do arquivo e é garantido que funcione em um sistema sem bugs.Os
?
na saída representam bytes que não constituem um caractere válido. Presumivelmente, um software está apresentando uma codificação de 8 bits herdada para uma ferramenta que espera UTF-8.Não tenho certeza se isso pode ser um sintoma de ferramentas do macOS trabalhando com um nome de arquivo com uma codificação inválida. Apenas no caso, tente executar os comandos em uma localidade C. Isso significa que todos os nomes de arquivos serão tratados como sequências de bytes, portanto, não há caracteres inválidos (no que diz respeito às ferramentas da terra do usuário - o kernel ainda pode ter problemas se o servidor remoto estiver fornecendo dados incorretos).
Outra abordagem que você pode tentar é executar
export LC_ALL=C
, digitarmv 12
e pressionar Tabpara concluir.Se isso não funcionar, então o problema é um sistema de arquivos com erros que reage de forma diferente quando solicitado a recuperar os metadados de um arquivo e quando solicitado a abrir um arquivo. Isso pode ser um bug ou uma configuração incorreta no cliente Samba ou no servidor Samba. Ou talvez o Samba esteja totalmente configurado para UTF-8 e não consiga lidar com um nome de arquivo no servidor que não esteja codificado em UTF-8. Eu recomendo verificar no servidor se o nome do arquivo está codificado em UTF-8. Se não estiver, renomeie-o no servidor. Se for, você tem um problema com a configuração do Samba.