`ln -sf`가 단지 심볼릭 링크인 기존 파일을 덮어쓸지 여부

`ln -sf`가 단지 심볼릭 링크인 기존 파일을 덮어쓸지 여부

~에서핵심 도구 ln수동:

대개왜냐하면기존 파일은 삭제되지 않습니다. 사용- 힘(-에프) 무조건 삭제하는 옵션
,- 인터렉티브(-나
) 조건부 로 제거하는 옵션--지원(-비) 옵션을 사용하여 이름을 바꿀 수 있습니다.

$ mkdir output

나는 이 실패를 이해할 수 있습니다.

$ ln -sT /etc/passwd output
ln: failed to create symbolic link ‘output’: File exists

그런데 왜 추가하지?-f 반품실패하다:

$ ln -sfT /etc/passwd output
ln: ‘output’: cannot overwrite directory

-f 다른 유형의 파일(디렉터리, 일반 파일...)이 아닌 심볼릭 링크로만 구성된 기존 파일을 덮어쓰 시겠습니까 ?

-T마지막 매개변수(예: 대상 파일 매개변수)가 기존 디렉터리 이고 해당 디렉터리를 링크로 덮어쓰려는 경우에 사용할 수 있나요 ?

답변1

UNIX에서 디렉토리는 다음과 같습니다.특별한(Saturday Night Live의 교회 여인을 채널링하는 것 같은 느낌이 들었습니다.) 디렉터리에는 다른 파일이 포함되어 있으므로 해당 파일을 삭제하려면 다른 작업이 필요합니다. 디렉터리가 비어 있더라도 여전히 두 개의 파일( ...)이 있으므로 디렉터리가 실제로 비어 있고 관련 파일의 링크 수가 업데이트될 때까지 디렉터리를 삭제할 수 없습니다.

UNIX 초기(내 첫 경험은 Bell Labs의 버전 6이었습니다)에는 일반 파일과 디렉토리에 대해 두 개의 서로 다른 명령( rmrmdir)이 있었는데, 이는 두 개의 서로 다른 시스템 호출이라는 근본적인 사실을 반영합니다. rm간단히 말해서, 이름을 지정한 항목을 디렉터리에서 제거하고 해당 항목이 가리키는 파일의 참조 횟수를 줄입니다(물론 참조 횟수가 0이 아닌 한 파일은 실제로 삭제되지 않습니다). rmdir더 많은 것이 필요하면(실제로 애플리케이션이 아니라 시스템 호출에서) 디렉토리로 가서 및 항목을 찾고 .해당 ..inode로 이동하여 참조 카운트를 감소시킨 다음 상위 항목을 삭제하고 참조 카운트를 줄여야 합니다. (디렉토리 자체에서 방금 감소한 참조 횟수와 동일하며 .이 시점에서는 0이어야 합니다.) 이 모든 것은 여러 다른 디스크 섹터에 걸쳐 있으므로 fsck가 언제든지 중단(예: 시스템 충돌) 가능성으로부터 복구할 수 있도록 주의 깊게 조정해야 합니다.

물론 최신 UNIX 시스템에서는 하드웨어 제한(예: 최대 프로그램 크기 64Kbyte,"K")가 완화되어 이제 rm -r많은 잠재적인 작업을 수행할 수 있습니다.특별한디렉토리의 성격은 덜 명확하지만 여전히 존재합니다. 6판 컴퓨터에서 큰 트리를 삭제해야 했던 기억이 납니다. 여기에는 모든 디렉터리로 이동하여 모든 파일을 삭제하고 상위 디렉터리로 돌아가 rmdir디렉터리 트리 전체에서 모든 재귀 작업을 수동으로 수행하는 작업이 포함되었습니다. 우리는 이를 돕기 위해 스크립트를 고려했지만 당시에는 매우 드물게 발생했고 너무 위험했기 때문에 누군가에게 모든 노력을 기울이도록 요청하는 것이 치명적인 오류를 방지하는 데 도움이 되기로 결정했습니다.

처음으로 " 복원하는 방법 sudo rm -rf /대신 ''를 입력했습니다."라는 질문을 받으면 아마도 우리가 왜 그렇게 조심하는지 이해하게 될 것입니다../

답변2

파일을 삭제할 수 있지만 디렉터리는 "파일"이 아닙니다.

➜  lab touch file        
➜  lab mkdir dir
➜  lab ln -sfT /home file
➜  lab ln -sfT /home dir 
ln: dir: cannot overwrite directory

이것은에서 볼 수 있습니다원천:

  if (remove_existing_files || interactive || backup_type != no_backups)
    {
      dest_lstat_ok = (lstat (dest, &dest_stats) == 0);
      if (!dest_lstat_ok && errno != ENOENT)
        {
          error (0, errno, _("failed to access %s"), quoteaf (dest));
          return false;
        }
    }
[...]
  if (dest_lstat_ok)
    {
      if (S_ISDIR (dest_stats.st_mode))
        {
          error (0, 0, _("%s: cannot overwrite directory"), quotef (dest));
          return false;
        }
      if (interactive)
        {
          fprintf (stderr, _("%s: replace %s? "), program_name, quoteaf (dest));
          if (!yesno ())
            return true;
          remove_existing_files = true;
        }

dest_lstat_okfalse에서 시작하는 부울은 true가 되며 첫 번째 if 문을 호출합니다.그게 remove_existing_files사실이니까, --force사인이 있으니까, 그러면 두 번째 if 문을 확인할 수 있습니다. 예상하기 때문에 디렉토리 삭제를 거부합니다.문서.

-T그렇게 설정하지 않으면ln은 디렉토리를 디렉토리가 아닌 것으로 취급하지 않습니다., ln은 소스의 기본 이름을 사용하여 디렉토리 아래에 심볼릭 링크만 생성합니다.

관련 정보