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

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

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

1 ответ1

0

В 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";
  }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .