Break all hardlinks within a folder

Posted by Georges Dupéron on Server Fault See other posts from Server Fault or by Georges Dupéron
Published on 2012-05-06T17:39:14Z Indexed on 2012/11/01 11:03 UTC
Read the original article Hit count: 358

Filed under:
|

I have a folder which contains a certain number of files which have hard links (in the same folder or somewhere else), and I want to de-hardlink these files, so they become independant, and changes to their contents won't affect any other file (their link count becomes 1).

Below, I give a solution which basically copies each hard link to another location, then move it back in place.

However this method seems rather crude and error-prone, so I'd like to know if there is some command which will de-hardlink a file for me.

Crude answer :

Find files which have hard links (Edit: To also find sockets, etc. that have hardlinks, use find -not -type d -links +1) :

find -type f -links +1

A crude method to de-hardlink a file (copy it to another location, and move it back) : Edit: As Celada said, it's best to do a cp -p below, to avoid loosing timestamps and permissions. Edit: Create a temporary directory and copy to a file under it, instead of overwriting a temp file, it minimizes the risk to overwrite some data, though the mv command is still risky (thanks @Tobu).

# This is unhardlink.sh
set -e
for i in "$@"; do
  temp="$(mktemp -d ./hardlnk-XXXXXXXX)"
  [ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp"
done

So, to un-hardlink all hard links (Edit: changed -type f to -not -type d, see above) :

find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh

© Server Fault or respective owner

Related posts about unix

Related posts about hardlink