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

279
dvanhook

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

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

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

0

1 ответ на вопрос

0
jimtut

В 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"; } } 
Вау, это здорово - отличная детективная работа. Спасибо за сценарий тоже. Мой тесть позвонил в службу поддержки Apple, и, как оказалось, они все заново загрузили, и данные вернулись с большинством файлов из iCloud. Не уверен, почему этого не было с самого начала, но это вопрос для Тима С, я думаю. Отмечая это как полный ответ, тем не менее, поскольку этот сценарий сладок. dvanhook 6 лет назад 0