MacOS의 iCloud Drive - 확장자가 없는 파일은 열리지 않습니다.

MacOS의 iCloud Drive - 확장자가 없는 파일은 열리지 않습니다.

시아버지의 이상한 일을 도와주려고 하는데 갑자기 그의 새 MacBook Pro에 있는 iCloud Drive 문서 중 상당 부분(아마 20%)이 열리지 않습니다. 확인해 보니 문제가 있는 파일은 파일 확장자가 없는 파일인 것으로 보입니다. .doc 파일이 아닌 'Unix 실행 파일'로 표시됩니다.

들어가서 파일 확장자로 .doc를 추가하면 파일이 즉시 다운로드되어 제대로 열립니다.

전에 이걸 본 사람 있나요? 실제로 수백 개의 파일 이름을 한 번에 하나씩 수동으로 바꾸는 것 외에 다른 해결책이 있습니까?

답변1

Mac OS 9 및 이전 버전에서는 Mac이 어떤 파일 형식을 가지고 있는지 알 수 있는 유일한 방법은 파일 "유형" 및 "작성자" 코드를 통해서였습니다. OS X에서는 확장자로 전환했지만 해당 코드는 여전히 존재했습니다(처음에는 설정을 무시할 수 있었지만 지금은 파일을 식별하는 "백업" 방법이라고 생각합니다).

방금 DOC 파일(확장자가 .doc)을 가져와 이름을 "Foo"(확장자 없음)로 바꿨더니 Finder가 이를 인식했습니다. 명령 을 사용하여 xattr원본 파일의 코드가 새 파일에 복사되어 첫 번째 Mac에서 Finder가 열릴 수 있음을 확인할 수 있었습니다.

다른 Mac(iCloud를 통해 동기화됨)에서 Finder를 확인하면 "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";
  }
}

관련 정보