iCloud Drive no MacOS – arquivos sem extensões não abrem

iCloud Drive no MacOS – arquivos sem extensões não abrem

Tentando ajudar meu sogro com um problema estranho: de repente, uma grande porcentagem (talvez 20%) de seus documentos do iCloud Drive em seu novo MacBook Pro não abre. Eu olhei para ele e os arquivos problemáticos parecem ser arquivos que não possuem extensões de arquivo. Eles aparecem como arquivos 'executáveis ​​​​Unix' em vez de arquivos .doc.

Se eu entrar e adicionar o .doc como extensão de arquivo, o arquivo será baixado imediatamente e aberto corretamente.

Alguém já viu isso antes? Existe alguma solução além de renomear manualmente centenas de arquivos, um de cada vez?

Responder1

No Mac OS 9 e anteriores, a única maneira de um Mac saber que tipo de arquivo você tinha era por meio dos códigos "Tipo" e "Criador" do arquivo. Com o OS X, ele mudou para extensões, mas esses códigos ainda estavam lá (possivelmente poderiam substituir as configurações no início, mas agora acho que são uma forma de "backup" para identificar arquivos).

Acabei de pegar um arquivo DOC (com extensão .doc), renomeá-lo para "Foo" (sem extensão) e o Finder o reconheceu. Usando o xattrcomando, pude ver que os códigos do arquivo original foram copiados para o novo arquivo, para que o Finder no meu primeiro Mac pudesse abrir.

Verificando o Finder em outro Mac (sincronizado através do iCloud) e o arquivo "Foo" é um arquivo UNIX. Portanto, o iCloud NÃO está sincronizando os atributos estendidos da fonte. Sem uma extensão, você teria que reaplicar os códigos no destino ou apenas adicionar a extensão.

Com alguma sorte, você manteve arquivos do Word, Excel, etc. em pastas separadas e pode renomeá-los em lote (veja abaixo). Caso contrário, você pode executar o filecomando em cada arquivo para ver o que é e renomeá-lo manualmente.

Para renomear arquivos em lote, acho que existem várias ferramentas para fazer isso, ou você pode usar este script Perl para fazer isso. Eu escrevi isso anos atrás e é ridículo, mas funciona para tudo que eu joguei nele.

#!/usr/bin/perl

use strict;
use File::Copy;

if (scalar(@ARGV) < 2) {
  print "\nUSAGE: $0 <extension> <file(s)>\n\n";
  exit 1;
}

my $ext = shift;
# Strip off leading period, since we'll add it later.
$ext =~ s/^\.//;

# Everytime I pass this script's @ARGV back out to a system call
# the whole argument arrary gets treated like a long string.
# If any individual $ARGV had spaces in it, that $ARGV ends up
# looking like multiple args to the system call.
# So, parse each $ARGV one at a time, in double-quotes.
foreach my $arg (@ARGV) {
  if ($arg =~ m/\./) {
    # This $arg already has an extension!
    if ($arg =~ m/\.$ext$/) {
      # This $arg already has this $ext.  Skip it.
      warn "WARNING!  $arg already has that extension.\n";
      next;
    }
    else {
      # This $arg has an extension, but it's not the same as $ext.
      warn "WARNING!  $arg already had an extension.\n";
    }
  }
  renameFile("\$", ".$ext", $arg);
}

sub renameFile {
  my $searchString = shift;
  my $replacementString = shift;
  my $file = shift;

  if (-e "$file") {
    my $newName = $file;
    if ($newName =~ s/$searchString/$replacementString/ge) {
      if (-e "$newName") {
        print "ERROR!  Unable to move '$file' to '$newName' because\n";
        print "        a file named '$newName' already exists!\n";
      }
      else {
        print "Moving '$file' to '$newName'.\n";
        move("$file", "$newName") || die "Unable to rename '$file'.\nStopped";
      }
    }
  }
  else {
    print "File '$file' does not exist.\n";
  }
}

informação relacionada