하드링크를 심볼릭링크로 변환

하드링크를 심볼릭링크로 변환

심볼릭 링크는 하드 링크 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. 그렇지 않으면 링크가 깨질 수 있습니다.

관련 정보