找到损坏的符号 link 然后在备份中找到相应的文件并重新 link

Find broken symbolic link then find respective file in backup and relink

我有很多损坏的符号 link 指向那个位置不再存在的文件,我可以用这个 oneliner 找到所有这些文件:

find . -type l | while read f; do if [ ! -e "$f" ]; then ls -l "$f"; fi; done

这给了我这样的东西:

./17_50.paired.right.fastq.gz -> ../../../../../../../.git/annex/objects/24/P0/SHA256E-s4214107462--c36267de6b6d438d1ea9c0f262be5a873aaffdf8845a42377e159db6a71b404d.gz/SHA256E-s4214107462--c36267de6b6d438d1ea9c0f262be5a873aaffdf8845a42377e159db6a71b404d.gz

现在,我在别处备份了 linked 文件,我想使用第一个 oneliner 的结果在备份中找到文件 SHA256E-s4214107462--c36267de6b6d438d1ea9c0f262be5a873aaffdf8845a42377e159db6a71b404d.gz 并替换原来的 link 变成这样的

./17_50.paired.right.fastq.gz -> /path/to/backup/SHA256E-s4214107462--c36267de6b6d438d1ea9c0f262be5a873aaffdf8845a42377e159db6a71b404d.gz

我该怎么做? 谢谢。

它不是最漂亮的,但它很管用。

find . -type l | while read f
do
    if [ ! -e "$f" ] #if link is broken
        then 
        item=$(ls -l "$f")
        filepath=$(echo "$item" | sed -n 's/^.* \.\/\s*\(\S*\).*$//p') #extract filepath by looking for " ./"
        oldlinkpath=$(echo "$item" | sed -n 's/^.*>\s*\(\S*\).*$//p') #extract linkpath by looking for ">"
        oldlinkfilename=$(basename "$oldlinkpath")
        newlinkpath=$(find /mnt/usbbackup/ppgdata/data -type f -name "$oldlinkfilename") #find file in backup
        rm "$filepath" #remove symlink
        echo "linking $filepath to $newlinkpath"
        ln -s "$newlinkpath" "$filepath" #create new symlink to file in backup
    fi
done 
  1. 找到所有破碎的links
  2. 提取损坏的路径link
  3. 找到 linked 文件的文件名
  4. 通过文件名在备份中找到 linked 文件
  5. 将link更改为备份中的位置

完成后,我 运行 'symlinks -c folder' 将所有绝对路径更改为相对路径。