iCloud Drive на MacOS — файлы без расширений не открываются

iCloud Drive на MacOS — файлы без расширений не открываются

Пытаюсь помочь своему тестю с одной странной проблемой: внезапно большой процент (возможно, 20%) его документов iCloud Drive на его новеньком MacBook Pro не открывается. Я посмотрел, и проблемные файлы, похоже, не имеют расширений. Они отображаются как файлы «исполняемые файлы Unix», а не как файлы .doc.

Если я зайду и добавлю расширение .doc в качестве расширения файла, файл немедленно загрузится и откроется правильно.

Кто-нибудь сталкивался с этим раньше? Есть ли решение, кроме как вручную переименовывать сотни файлов по одному?

решение1

В Mac OS 9 и более ранних версиях единственным способом для Mac узнать, какой тип файла у вас был, были коды «Тип» и «Создатель». С OS X он переключился на расширения, но эти коды все еще были там (возможно, они могли переопределять настройки в начале, но теперь я думаю, что это «резервный» способ идентификации файлов).

Я просто взял файл DOC (с расширением .doc), переименовал его в "Foo" (без расширения), и Finder его распознал. Используя команду xattr, я смог увидеть, что коды из исходного файла были скопированы в новый файл, поэтому Finder на моем первом Mac смог его открыть.

Проверяю Finder на другом Mac (синхронизированном через iCloud) и файл "Foo" является файлом UNIX. Таким образом, iCloud НЕ синхронизирует расширенные атрибуты из источника. Без расширения вам придется повторно применить коды на стороне назначения или просто добавить расширение.

Если повезет, вы сохранили файлы Word, Excel и т. д. в отдельных папках и можете переименовывать их в пакетном режиме (см. ниже). Если нет, вы можете запустить команду fileдля каждого файла, чтобы увидеть, что это такое, а затем переименовать вручную.

Для пакетного переименования файлов, я думаю, есть куча инструментов, чтобы сделать это, или вы можете использовать этот скрипт Perl, чтобы сделать это. Я написал его много лет назад, и он отстойный, но он работает для всего, что я в него вкладывал.

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

Связанный контент