심볼릭 링크는 하드 링크 ln -f
(예)
두 파일을 모두 알고 있고 자신이 "원본 파일"임을 정의하는 경우 하드 링크(파일 이름 link
및 )를 다시 심볼릭 링크로 original
변환하는 것도 쉽습니다 . 다음 결과로 link->original
간단한 스크립트를 쉽게 만들 수 있습니다 .convert-known-hardlink-to-symlink
convert-known-hardlink-to-symlink link original
$ ls -li
3802465 lrwxrwxrwx 1 14 Dec 6 09:52 link -> original
3802269 -rw-rw-r-- 1 0 Dec 6 09:52 original
하지만 정의할 수 있는 스크립트가 있다면 매우 유용할 것입니다.작업 디렉토리(기본값 ./
) 및검색 디렉토리 검색 위치(기본값 /
) 동일한 inode를 가진 파일의 경우 이러한 모든 하드 링크를 기호 링크로 변환합니다.
결과적으로 정의된 작업 디렉토리의 모든 하드 링크된 파일은 동일한 inode를 가진 첫 번째 발견 파일에 대한 심볼릭 링크로 대체됩니다.
시작은find . -type f -links +1 -printf "%i: %p (%n)\n"
답변1
이를 수행하기 위해 스크립트를 만들었습니다. 스크립트는 작업 디렉터리(선택적인 두 번째 인수)와 동일한 소스 디렉터리(첫 번째 인수)에서 찾은 모든 하드 링크를 기호 링크로 변환합니다.
https://gist.github.com/rubo77/7a9a83695a28412abbcd
시험 실행을 위한 -n 옵션이 있는데, 이는 수행할 작업만 보여줍니다.
주요 부분:
$WORKING_DIR=./
#relative source directory from working directory:
$SOURCE_DIR=../otherdir/with/hard-links/with-the-same-inodes
# find all files in WORKING_DIR
cd "$WORKING_DIR"
find "." -type f -links +1 -printf "%i %p\n" | \
while read working_inode working_on
do
find "$SOURCE_DIR" -type f -links +1 -printf "%i %p\n" | sort -nk1 | \
while read inode file
do
if [[ $inode == $working_inode ]]; then
ln -vsf "$file" "$working_on"
fi
done
done
-links +1 --> 2개 이상의 링크가 있는 모든 파일을 찾습니다. 하드 링크된 파일의 링크 수는 2개 이상입니다.
답변2
최소한 GNU find
숫자로( -inode
) 또는 링크를 지정( -samefile
)하여 Inode별로 검색할 수도 있습니다.
따라서 다음을 사용할 수 있습니다.
find "$WORKING_DIR" -type f -links +1 | while read file
do
find "$SOURCE_DIR" -samefile "$file" -exec ln -vsf '{}' "$file" \;
done
별도의 디렉토리를 사용해야 합니다. 반면에 ln
파일 자체를 링크하려고 하면 불평이 나옵니다.
또한 절대 경로를 제공 $SOURCE_DIR
하거나 상대 링크를 생성 -r
하는 옵션을 사용해야 합니다 ln
. 그렇지 않으면 링크가 깨질 수 있습니다.