기존 파일 2개 연결

기존 파일 2개 연결

2개의 기존 파일이 있습니다: abcdxyz.

$ cat abcd
abcd 
$ cat xyz
xyz

이제 이러한 파일을 소프트 링크하려고 하면 다음 메시지가 나타납니다.

ln: cannot create xyz: File exists

나는 사용하고 싶지 않다

ln -sf abcd xyz

xyz명령을 사용하면 내용을 내용으로 덮어쓰게 되기 때문입니다 abcd.

내가 원하는 것은 연결이 해제되면 abcd및 모두 원본 콘텐츠를 표시해야 한다는 것입니다.xyz

즉, 임시로 두 파일을 연결하고 싶습니다.

소프트/하드 링크(예: 설치 등) 외에 다른 솔루션이 있는지 제안해 주세요.

편집: ,,, 등과 Solaris OS같은 명령을 수동으로 입력하지 않고 사용하고 있습니다 .mount --bindmount -Bbindfsfusermount

또한:을 사용해 보았 mount -o bind abcd xyz더니 다음과 같은 메시지가 표시되었습니다 cannot open /etc/vfstab. 확인해 보니 나만 접근할 수 있는 것으로 확인 /etc/vfstab됐다 Root.

답변1

ln이것은 우리가 해야 할 일이 아닙니다 . ln기존 파일에 대한 하드 링크를 만듭니다. 즉, 디스크의 동일한 파일을 가리키는 두 개 이상의 디렉터리 항목을 만듭니다. 연결된 파일이 작동하는 방식은 하나의 파일을 편집하면 모든 파일에 영향을 미친다는 것입니다.

원하는 기능은 Unix 고유의 기능이 아닙니다(나중에 연결 해제할 수 있도록 파일을 하나로 표시하도록 연결). 리눅스그러나 바인드 마운팅이라는 기능이 (몇 년 전) 구현되어 하나의 파일이나 디렉터리를 다른 파일이나 디렉터리(파일 위에 파일, 디렉터리 위에 디렉터리)를 탑재할 수 있습니다.

제안된 솔루션:한 파일이 일시적으로 다른 파일이 되도록 하려면 바인드 마운트( mount -B file1 file2)를 사용하십시오. 이 파일 file1은 에 설치됩니다 file2. 나중에 제거하면 이 두 파일이 원래 있던 대로 다시 나타납니다.

# echo A >A

# echo B >B

# mount -B A B

# cat A
A

# cat B
A

# umount B

# cat A
A

# cat B
B

"링크된" 파일을 두 파일의 연결로 표시하려면 세 번째 파일을 만들고 나중에 삭제해야 합니다.

답변2

이 명령은 다음과 같습니다.

ln -sf abcd xyz

당신이 생각하는 것처럼 xyz콘텐츠로 다루어지지 않을 콘텐츠 abcd. 심볼릭 링크는 파일이 아니므로 내용이 없습니다.

xyz콘텐츠를 잃지 않고 일시적 으로 링크 하려면 abcd콘텐츠를 어떻게든 저장해야 합니다.

  • 내용을 임시 파일에 복사할 수 있습니다. 이건 설명이 필요 없을 것 같아요.
  • 메모리를 사용할 수도 있습니다. 즉, 콘텐츠를 변수에 저장할 수도 있습니다.
  • 하드 링크를 사용할 수 있습니다.

이제 마지막 것을 보여 드리겠습니다. 귀하의 질문에 설명된 대로 abcd및 이 있습니다 xyz.

  1. 하드 링크는 원하는 위치에 콘텐츠를 xyz보관합니다 .zyxzyxxyz

    $ ln xyz zyx
    

    현재로서는 xyzzyx개의 하드 링크가 있습니다.인덱스 노드xyz귀하의 질문에 명시된 데이터가 포함되어 있습니다 . 다음을 통해 확인할 수 있습니다:

    $ cat zyx
    xyz
    
  2. 이제 이것이 zyx준비되었으므로 강제로 xyz에 다시 연결할 수 있습니다 abcd.

    $ ln -sf abcd xyz
    

    zyx여전히 문자를 유지하고 있습니다 xyz. 다음을 통해 확인할 수 있습니다:

    $ cat zyx
    xyz
    

    이제 에 xyz소프트 링크되어 있습니다 abcd. 확인하려면 다음 명령을 실행하세요.

    $ cat xyz
    abcd
    
  3. 시작 상태를 복원하려면 xyz원본 콘텐츠에 다시 연결하세요. 즉, 원래 inode에 다시 연결합니다.

    $ ln -f zyx xyz
    

    작동하는지 확인하려면 다음을 수행하세요.

    $ cat xyz
    xyz
    

    이제 다음을 사용하여 하드 링크의 연결을 해제할 수 있습니다 zyx.

    $ rm zyx
    

    또는 향후 작업을 위해 보관하세요. 어느 쪽이든 xyz처음에 수행한 작업이 여전히 포함되어 있습니다.

    $ rm zyx
    $ cat xyz
    xyz
    

답변3

연결이 해제되면 abcd와 xyz 모두 원본 콘텐츠를 표시해야 합니다.

그렇다면 당신이 원하는 것은 링크가 아닙니다. 두 파일이 링크되어 있으면 내용이 동일합니다. 보다 정확하게는 두 개의 디렉토리 항목이 동일한 파일을 가리키는 경우 연결됩니다. 파일 링크를 해제해도 두 개의 파일이 남지 않습니다. 디렉토리 항목 링크를 해제한다는 것은 디렉토리 항목을 삭제하는 것을 의미합니다(파일을 삭제하는 시스템 호출은 라고도 함 unlink).

다른 파일로 파일을 숨기는 범용 기능은 없습니다. 당신은 그것을 사용할 수 있습니다파일 시스템 바인딩파일 시스템은 디렉터리를 다른 디렉터리와 섀도우 매핑합니다. xyz디렉토리를 디렉토리로 섀도우 매핑 하려면 abcd다음을 실행하세요.

bindfs -n -o nonempty xyz abcd

그 후에는 의 이전 콘텐츠가 abcd숨겨지고 abcd어떤 방식으로든 액세스 할 수 있습니다 xyz. Bindfs는퓨즈파일 시스템 생성바인드 마운트. 섀도우를 실행 취소하고 원본 내용을 보려면 abcd파일 시스템을 마운트 해제합니다.

fusermount -u abcd

파일 시스템을 마운트해도 디스크에 저장된 내용은 변경되지 않습니다. 섀도우는 컴퓨터로 제한되며 다음에 재부팅할 때까지만 지속됩니다. 섀도우를 유지하려면 시작 시 설치된 목록( /etc/fstab)에 이 설치를 추가해야 합니다. 그러나 섀도우를 유지하려면 설치하는 것이 올바른 방법이 아닐 수 있습니다. 파일을 이동하고 심볼릭 링크를 생성하기만 하면 됩니다.

mv abcd abcd.orig
ln -s xyz abcd

돌아가려면 심볼릭 링크를 삭제하고 원본 파일로 다시 이동하세요.

rm abcd
mv abcd.orig abcd

답변4

내가 이해한 바로는 두 파일을 연결하고 싶지만 두 파일의 데이터가 손실되는 것을 원하지 않는 것 같습니다. 게시물에 Solaris라는 태그를 달았으므로 이 운영 체제를 사용한다고 가정합니다. 그래서 다른 운영체제의 기능을 참고하는 것은 무의미해 보입니다. 이 답변에서는 데이터에 하나 이상의 zfs 데이터 세트를 사용한다고 가정합니다.

파일 시스템의 zfs 스냅샷을 생성하고, 파일 대신 링크를 삽입하고, ln -sf abcd xyz를 생성하고, 원하는 작업을 수행한 후 롤백할 수 있습니다.

root@solaris:/rpool# zfs create rpool/filesystem1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file1
root@solaris:/rpool# mkfile 1k /rpool/filesystem1/file2
root@solaris:/rpool# ls -l /rpool/filesystem1
total 2
-rw-------   1 root     root        1024 Jun  8 20:33 file1 .  
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# zfs snapshot rpool/filesystem1@withtwofiles
root@solaris:/rpool# rm /rpool/filesystem1/file2
root@solaris:/rpool# ln -s /rpool/filesystem1/file1 /rpool/filesystem1/file1
root@solaris:/rpool# ls -l /rpool/filesystem1
total 4
-rw-------   1 root     root        1024 Jun  8 20:33 file1
lrwxrwxrwx   1 root     root          24 Jun  8 20:33 file2 -> /rpool/filesystem1/file1
root@solaris:/rpool# zfs rollback rpool/filesystem1@withtwofiles
root@solaris:/rpool# ls -l /rpool/filesystem1
total 6
-rw-------   1 root     root        1024 Jun  8 20:33 file1
-rw-------   1 root     root        1024 Jun  8 20:33 file2
root@solaris:/rpool# 

링크를 해제하는 대신 링크를 사용하여 파일 시스템을 간단히 롤백할 수 있습니다.

관련 정보