dir1
예를 들어 dir2
... 와 같은 특정 수의 소스 디렉토리가 있는 경우 dir5
소스 디렉토리의 모든 파일과 디렉토리를 포함하지만 중복 파일은 포함하지 않는 자동으로 동기화된 "병합" 대상 디렉토리를 어떻게 만들 수 있습니까?
예를 들어 다음과 같은 소스 디렉터리 구조가 있습니다.
dir1/
- a
- b
dir2/
- b <-- Note the duplicate name, this one is more recent than dir1\b
- c
- dir2.1/ <-- Subdirectories present too.
- z
dir3/
- d
..."병합"되면 다음과 같습니다.
merge/
- dir2.1/
- z
- a
- b <-- Which one to show is based on modified time; most recent first.
- c
- d
(수천 개의 파일과 하위 디렉터리를 포함하는 수십 개의 디렉터리가 있다고 가정합니다.)
소스 목록의 모든 파일과 디렉터리는 그대로 유지되어야 하며 "병합된" 대상 디렉터리는 추가 저장소를 차지해서는 안 됩니다. 즉, inotify를 사용하여 일부 데몬이 관리하는 모든 기호 링크일 수 있습니다. 또한 소스 디렉터리는 파일과 하위 디렉터리를 자주 추가하고 제거하며, 이는 가능한 한 빨리 "병합된" 디렉터리에 반영되어야 합니다.
몇 가지 사용 예:
새 파일을 생성하면 dir3/e
즉시(또는 몇 초 내에) 디렉토리에 자동으로 나타납니다 merge
.
파일을 삭제 하면 즉시(또는 몇 초 내에) 디렉토리에서 dir1/a
자동으로 사라집니다.merge
dir3/d
열어서 편집 해요merge/d
업데이트된 수정 날짜를 갖도록 호출하고 touch
있으므로 최신 날짜를 가리키도록 자동으로 업데이트됩니다 .dir1/b
dir2/b
merge/b
dir1/b
나는 그것을 삭제했고 dir1/b
이제는 merge/b
이전 파일을 가리킬 것입니다 dir2/b
.
그 안에 파일을 만들려고 했는데 merge
의미가 없어서 오류가 발생했습니다!
답변1
여러 디렉터리의 내용을 동적으로 결합하는 것은 정확히공동 설치(또는 Union File System)에 관한 것입니다. Linux에는 다양한 구현이 있지만 일반적인 구현은 항상 하나의 특정 분기를 선호하여 분기 간의 중복을 해결합니다(예: 둘 다 존재하는 경우 dir2/file
항상 우선 순위를 가짐 dir1/file
). 그런데 방금 알았어파일 시스템 병합특히 파일별로 최신 파일을 선택할 수 있는 보다 유연한 정책이 있습니다.
설정:
mkdir dir1 dir2 merge
echo 1 >dir1/b; echo 2 >dir2/a
sleep 1
echo 1 >dir1/a; echo 2 >dir2/b; echo 2 >dir2/c
이제 우리는 버스에 탔습니다. newest
파일 액세스( search
) 및 메타데이터 수정( ) action
에 대한 정책을 설정하고 생성을 허용하지 않습니다( create
)(사용 가능한 디스크 공간에 따라 항상 동일하거나 무작위로 생성을 분기 중 하나에 전달할 수 있습니다!).
$ mergerfs -o category.action=newest,category.search=newest,category.create=erofs dir1:dir2:dir3 merge
$ head merge/?
==> merge/a <==
1
==> merge/b <==
2
==> merge/c <==
2
$ rm dir2/c
$ echo merge/?
a b
제거:fusermount -u merge
답변2
이것은 bash를 사용하여 수정한 것입니다. 이 솔루션의 단점은 스크립트가 실행되는 동안 각 복사본에 대해 심볼릭 링크를 생성하지만 (동일한 이름을 가진) 마지막 파일 이름이 최신 타임스탬프를 가진 파일이므로 해당 파일을 가리키는 심볼릭 링크가 예약된다는 것입니다.
실행하기 전에 MDIR(병합 디렉터리) 및 BDIR 변수(초기 디렉터리/다중 디렉터리)를 변경해야 합니다.
MDIR=/tmp
(
BDIR="/tmp/ssh /etc/ssh"
for entry in $(find $BDIR -type f -exec stat --printf "%n,%Y\n" {} \;);do
fname=$(echo $entry | cut -f 1 -d ,)
tstamp=$(echo $entry | cut -f 2 -d ,)
bname=$(basename $fname)
echo $bname,$fname,$tstamp
done
) | sort -t, -nk 3 | \
while read entry;do
bname=$(echo $entry | cut -f 1 -d ,)
fname=$(echo $entry | cut -f 2 -d ,)
tstamp=$(echo $entry | cut -f 3 -d ,)
ln -svf $fname $MDIR/$bname
done
답변3
ln
여러 포인터가 동일한 실제 파일을 가리키도록 허용하는 기호( ) 링크 만들기 를 사용하면 -s
주요 질문에 답할 수 있습니다. 그러나 지금은 autoadd 사용 예제로 충분합니다(그러나 귀하의 제목과 제목을 읽는 다른 사람들에게는 유용할 수 있습니다).
ln -s src/of/actual/file merge_directory/pointer_link