2개의 기존 파일이 있습니다: abcd
및 xyz
.
$ cat abcd
abcd
$ cat xyz
xyz
이제 이러한 파일을 소프트 링크하려고 하면 다음 메시지가 나타납니다.
ln: cannot create xyz: File exists
나는 사용하고 싶지 않다
ln -sf abcd xyz
xyz
명령을 사용하면 내용을 내용으로 덮어쓰게 되기 때문입니다 abcd
.
내가 원하는 것은 연결이 해제되면 abcd
및 모두 원본 콘텐츠를 표시해야 한다는 것입니다.xyz
즉, 임시로 두 파일을 연결하고 싶습니다.
소프트/하드 링크(예: 설치 등) 외에 다른 솔루션이 있는지 제안해 주세요.
편집: ,,, 등과 Solaris OS
같은 명령을 수동으로 입력하지 않고 사용하고 있습니다 .mount --bind
mount -B
bindfs
fusermount
또한:을 사용해 보았 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
.
하드 링크는 원하는 위치에 콘텐츠를
xyz
보관합니다 .zyx
zyx
xyz
$ ln xyz zyx
현재로서는
xyz
두zyx
개의 하드 링크가 있습니다.인덱스 노드xyz
귀하의 질문에 명시된 데이터가 포함되어 있습니다 . 다음을 통해 확인할 수 있습니다:$ cat zyx xyz
이제 이것이
zyx
준비되었으므로 강제로xyz
에 다시 연결할 수 있습니다abcd
.$ ln -sf abcd xyz
zyx
여전히 문자를 유지하고 있습니다xyz
. 다음을 통해 확인할 수 있습니다:$ cat zyx xyz
이제 에
xyz
소프트 링크되어 있습니다abcd
. 확인하려면 다음 명령을 실행하세요.$ cat xyz abcd
시작 상태를 복원하려면
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#
링크를 해제하는 대신 링크를 사용하여 파일 시스템을 간단히 롤백할 수 있습니다.