Unidade externa, não pode esvaziar o lixo, a rm vê um arquivo, mas ls -la não

9

Eu estava limpando uma pasta de música na minha unidade externa e encontrei um diretório que não posso excluir, não importa o que eu tente.

Se eu colocá-lo na lixeira via GUI

A operação não pode ser concluída porque o item "pasta" está em uso.

Se eu usar rm -rfpara removê-lo via terminal

$ rm -rf folder/
rm: folder/: Directory not empty

Se eu usar ls -lapara verificar seu conteúdo

$ ls -la
total 512
drwxrwxrwx  1 user  staff  131072 Jan  3  2017 .
drwxrwxrwx  1 user  staff  131072 Jan  3  2017 ..

Se eu usar rm -i *dentro da pasta

$ rm -i *
rm: 03 - Ēlusion.mp3: No such file or directory

Se eu usar sudo lsof +D folder/para verificar se algum arquivo foi aberto

Nada retorna na saída do programa.

Se eu usar o Utilitário de Disco para reparar discos e volumes (primeiros socorros)

A verificação de integridade foi aprovada e nenhum reparo foi iniciado.

Se eu reiniciar o macOS

O problema persiste.

Informação adicional:

  • Posso mover a pasta dentro da unidade, mas não para outra unidade.

  • Eu posso renomear a pasta.

  • ls -i *.mp3retorna ls: 03 - Ēlusion.mp3: No such file or directory, o mesmo que rm -i *.mp3.

  • O arquivo não aparece no Finder, é uma parte confusa, qualquer que seja o problema de exibição do nome de arquivo que o Terminal possa ter (eu sempre o defino Unicode - UTF-8), acho que há mais força em jogo.

Em resposta a perguntas, não, ls -ibnão retorna nada.

$ ls -i
$ ls -ib
$ ls -laib
total 512
2762318 drwxrwxrwx  1 user  staff  131072 Jan  3  2017 .
2685260 drwxrwxrwx  1 user  staff  131072 Jan  3  2017 ..

Então, aparentemente, há algo nele, mas ls -lanão foi possível vê-lo, enquanto rm -iestá sendo estranho com o nome do arquivo?

get info via menu de contexto da GUI confirmou que há 1 item na pasta, mas com zero byte e certamente não aparece no localizador.

Não tenho certeza do que fazer neste momento. Ajuda muito apreciada!

(Usando 10.13.4 + ExFAT na unidade externa)

bitinn
fonte
11
Você já pensou em fazer o backup de tudo o que deseja - provavelmente já fez o backup de qualquer maneira ... e depois re-formatar completamente essa unidade para começar de novo?
Solar Mike
Será que ls -bmostrar o arquivo? Nesse caso, você pode ls -biobter o inode e seguir a resposta abaixo ou, alternativamente, apenas copiar o nome do arquivo na -bsaída.
Reid
Eu acredito que o problema principal não está no nome do arquivo, ls -bi *.mp3mostre o mesmo resultado, como mostrado no OP.
bitinn

Respostas:

10

O problema parece ser causado por um arquivo chamado 03 - usionlusion.mp3 localizado dentro do diretório chamado folder .

Como o Terminal.app é incapaz de renderizar sinais diacríticos nos nomes de arquivos - bem, está, mas está além do escopo de fornecer a solução mais simples para você -, oculta sua falha ocultando o nome do arquivo (algo inédito por mim até agora ; talvez as alterações do High Sierra em /.file, /.volfs e inodes de 64 bits? Espere - não importa; sua edição da sua pergunta me diz que eu o entendi mal.) De qualquer forma, a existência do arquivo é conhecida, juntamente com o irônico alegação do Finder de que ele não existe. Obviamente, sim. Veja como mudar isso:

Primeiro, determine o número do inode do arquivo. No Terminal.app, cdno diretório "folder" e emita este comando:ls -i *.mp3

Copie a sequência numérica do inode fornecida na coluna esquerda da resposta, que será algo como

12345678 03 - E ̄lusion.mp3

- e coloque-o neste comando, que o renomeará para algo que o terminal possa renderizar corretamente:

find . -inum 12345678 -exec mv {} deletemenow \;

- exibindo o arquivo "deletemenow" na pasta "folder", dos quais você pode descartar da maneira que melhor lhe convier.

Doc G.
fonte
Uau, isso é um bug impressionantemente terrível.
chrylis -on strike-
2
Eu não acho que isso seja preciso. O terminal pode ocultar caracteres únicos que não podem ser renderizados, mas não remove toda a linha de texto.
duskwuff -inactive-
11
@duskwuff De qualquer maneira, parece que o nome do arquivo está causando problemas, portanto, essa é uma solução em potencial.
JAB
Desculpe, mas o problema parece mais complexo do que isso: tentei $ ls -i *.mp3, ele retorna ls: 03 - Ēlusion.mp3: No such file or directory.
bitinn
11
Você pode simplesmente executar ls -identro do diretório para impedir que a expansão do curinga do shell interfira?
Nohillside
9

Levei muito tempo para chegar a este resumo, mas acho que é a resposta definitiva.

A causa do meu problema é bem conhecida :

O OS X é o mais estranho, tanto por normalizar os nomes de arquivos quanto por usar NFD em vez da NFC mais comum .

Historicamente (não tão antigo, antes da era 10.11), o OS X + HFS + aplica o formulário NFD em todos os nomes de arquivos e você obterá apenas o resultado NFD de comandos e chamadas do sistema.

Então, as coisas começam a mudar; em 10.11, alguns resultados de chamadas do sistema são normalizados para NFC , o que o alinha com o Windows e Linux, mas às custas de quebrar alguns programas que esperam NFD no OS X.

Mas desde a introdução do macOS 10.13 + AFPS, o comportamento muda novamente: a Apple decide que deseja normalizar para NFD nas chamadas de exibição e do sistema , mas deixe os nomes de arquivos originais como estão (para que NFC e NFD sejam suportados, mas se você selecionar o nome do arquivo no Finder ou o lsresultado da cópia no Terminal, você obtém o formulário NFD).

Isso é ótimo, até você colocar um arquivo com o nome de arquivo NFD em uma unidade externa usando exFAT (como o único formato cross-macOS / Windows com suporte para tamanho de arquivo de 4 GB +): o macOS 10.13 de alguma forma acredita que seu arquivo deve estar no formato NFC, então deu um fora.

Na verdade, aqui está um teste rápido, eu tenho uma pasta no Windows na minha unidade exFAT com 3 arquivos:

insira a descrição da imagem aqui

  • test.mp3
  • Ēlusion.mp3( Ēem NFC)
  • 03 - Ēlusion( Ēem NFD)

(Você pode copiar o unicode exato aqui )

Quando eu os montei no meu macOS, é isso que eu vejo:

insira a descrição da imagem aqui

e ls -laibresultado:

$ ls -laib
total 46592
2762318 drwxrwxrwx  1 user  staff    131072 Jan  3  2017 .
2685260 drwxrwxrwx  1 user  staff    131072 Jan  3  2017 ..
1572961 -rwxrwxrwx  1 user  staff  11672464 Aug 23  2014 Ēlusion.mp3
1572871 -rwxrwxrwx  1 user  staff  11672464 Aug 23  2014 test.mp3

Como você pode ver, o arquivo NFC está presente, mas está faltando o arquivo NFD.

Mesmo se você estiver ciente do problema NFC / NFD no OS X , talvez não espere que a unidade externa exFAT enfrente esse problema da maneira oposta (a NFC está boa, mas a NFD está acesa).

Mas o que poderia ter causado meu arquivo de música a usar o nome do arquivo NFD em primeiro lugar:

  • Originalmente, baixei esse arquivo de música no 10.9 / 10.10 com um Mac mais antigo, que aplica o nome do arquivo NFD.
  • Em algum momento, eu os afasto para uma unidade Windows + NTFS, que não impõe NFC / NFD, para que o nome do arquivo NFD original seja preservado.
  • Agora, quero mover esse arquivo de volta para o meu macOS 10.13 + APFS usando uma unidade exFAT (o exFAT suporta a mesma convenção UTF-16 do NTFS).
  • O inferno se solta.

Eu poderia ter copiado o arquivo via unidade de rede ou TeamViewer, e tudo ficaria bem, mas o exFAT está acionando esse bug no macOS.

Lições:

  • O nome do arquivo Unicode ainda é uma ameaça.
  • Você realmente precisa de um Windows / Linux para corrigir esse problema (se a situação for do seu arquivo em uma unidade externa exFAT).
bitinn
fonte
@bitlinn: Clique no segundo link do meu comentário dirigido ao duskwulff e experimente a ferramenta de normalização unicode Apfelstrudel que você encontrará lá. Muito útil para APFS, sem sentido com exFAT. Ou é...?
Doc G.
11
@DocG. esse problema é um pouco mais complexo do que eu pensava inicialmente, mas atualizei minha resposta novamente!
bitinn
Sim, eu pensei que você poderia acabar fazendo isso. Veja meu comentário anterior sobre Error 36e faça uma pesquisa na Web por algo como "mover arquivos para a frente e para trás do Windows Mac Error 36" para obter mais informações sobre a separação de atribuições de arquivos em sistemas não HFS. Esse foi (outro) problema conhecido de nomeação de arquivos do MacOS / OS X desde a chegada do Sistema 10.6. Entre a normalização Unicode e a separação de atributo dot_underscore, você experimentou um erro duplo. Duvido que o comando dot_clean tenha uma chance.
Doc G.