하드 링크가있는 특정 파일 수를 포함하는 폴더가 있습니다 (동일한 폴더 또는 다른 곳에 있음).이 파일을 하드 링크 해제하여 독립적으로 만들고 내용을 변경해도 아무런 영향을 미치지 않습니다. 다른 파일 (링크 수는 1이 됨)
아래에는 기본적으로 각 하드 링크를 다른 위치로 복사 한 다음 제자리로 옮기는 솔루션이 있습니다.
그러나이 방법은 다소 조잡하고 오류가 발생하기 쉬우므로 파일을 하드 링크 해제하는 명령이 있는지 알고 싶습니다.
조잡한 답변 :
하드 링크가있는 파일 찾기 ( 편집 : 하드 링크가 있는 소켓 등을 찾으려면 find -not -type d -links +1
)을 사용 하십시오.
find -type f -links +1 # files only
find -not -type d -links +1 # files, sockets etc.
파일의 하드 링크를 해제하는 다른 방법 (파일을 다른 위치로 복사 한 후 다시 이동) :
편집 : Celada가 말했듯이 타임 스탬프 및 권한을 잃지 않도록 아래에서 cp -p를 수행하는 것이 가장 좋습니다. 편집 : 임시 파일을 만들고 임시 파일을 덮어 쓰지 않고 파일 아래에 파일로 복사하면 mv
명령이 여전히 위험 하지만 (@Tobu 덕분에) 일부 데이터를 덮어 쓸 위험이 최소화 됩니다. 편집 : 동일한 파일 시스템 (@MikkoRantalainen)에 임시 디렉토리를 작성하십시오.
# This is unhardlink.sh
set -e
for i in "$@"; do
temp="$(mktemp -d -- "${i%/*}/hardlnk-XXXXXXXX")"
[ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp"
done
(그래서, 모든 하드 링크를 해제 하드 링크 편집 : 변경 -type f
에 -not -type d
위 참조)
find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
cp -i
스위치, 그것은 오버라이드 (override) 할 필요가 묻는 나에게 몇 가지 메시지를 뱉었다 ./fileXXXXXX
합니다 ( $temp
, TMPFILE는 고유 한 파일 이름을 지정한다하더라도, 파일)이 있도록 해야 일종의 경쟁 조건 또는 그 밖의 모든 것이 될 수 있으며 일부 데이터를 잃을 위험이 있습니다.
unhardlink.sh
필요 unhardlinked 될 수있는 파일이 들어있는 같은 디렉터리 내부의 임시 디렉토리를 작성해야합니다. 그렇지 않으면 재귀 호출이 다른 파일 시스템 내에서 재귀하고 임시 디렉토리가 현재 작업 디렉토리에 있기 때문에 파일 시스템 경계를 넘어 물건을 이동하게 될 수 있습니다. "$(dirname "$i")/hardlink-XXXXXX"
대신 mktemp에 인수로 전달할 수 있다고 생각합니다 .
fuse
파일 시스템 인 경우 실제로 는와 path/to/hardlink-XXX
다른 물리적 저장 매체로 디스패치 할 path/to/original-file
수 있지만 이에 대해 수행 할 수있는 것은 많지 않습니다.