iCloud Drive en MacOS: los archivos sin extensiones no se abren

iCloud Drive en MacOS: los archivos sin extensiones no se abren

Intento ayudar a mi suegro con algo extraño: de repente, un gran porcentaje (tal vez el 20%) de sus documentos de iCloud Drive en su nuevo MacBook Pro no se abre. Lo miré y los archivos problemáticos parecen ser archivos que no tienen extensiones de archivo. Se muestran como archivos 'ejecutables de Unix' en lugar de archivos .doc.

Si entro y agrego el .doc como extensión de archivo, el archivo se descarga inmediatamente y se abre correctamente.

¿Alguien ha visto esto antes? ¿Existe alguna solución además de tener que cambiar manualmente el nombre de cientos de archivos, uno a la vez?

Respuesta1

En Mac OS 9 y versiones anteriores, la única forma en que una Mac sabía qué tipo de archivo tenía era a través de los códigos de "Tipo" y "Creador" de archivo. Con OS X, cambió a extensiones, pero esos códigos todavía estaban allí (posiblemente podrían anular la configuración al principio, pero ahora creo que son una forma de "respaldo" para identificar archivos).

Simplemente tomé un archivo DOC (con extensión .doc), le cambié el nombre a "Foo" (sin extensión) y el Finder lo reconoció. Usando el xattrcomando, pude ver que los códigos del archivo original se copiaron al nuevo archivo, por lo que se pudo abrir Finder en mi primera Mac.

Verificar Finder en otra Mac (sincronizado a través de iCloud) y el archivo "Foo" es un archivo UNIX. Por lo tanto, iCloud NO sincroniza los atributos extendidos de la fuente. Sin una extensión, tendrías que volver a aplicar los códigos en el lado de destino o simplemente agregar la extensión.

Con un poco de suerte, habrás guardado los archivos de Word, Excel, etc. en carpetas separadas y podrás cambiarles el nombre por lotes (ver más abajo). De lo contrario, puede ejecutar el filecomando en cada archivo para ver qué es y luego cambiarle el nombre manualmente.

Para cambiar el nombre de archivos por lotes, creo que hay toneladas de herramientas para hacerlo, o puedes usar este script Perl para hacerlo. Lo escribí hace años y es aburrido, pero funciona para todo lo que le he presentado.

#!/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";
  }
}

información relacionada