找到损坏的符号 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
- 找到所有破碎的links
- 提取损坏的路径link
- 找到 linked 文件的文件名
- 通过文件名在备份中找到 linked 文件
- 将link更改为备份中的位置
完成后,我 运行 'symlinks -c folder' 将所有绝对路径更改为相对路径。
我有很多损坏的符号 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
- 找到所有破碎的links
- 提取损坏的路径link
- 找到 linked 文件的文件名
- 通过文件名在备份中找到 linked 文件
- 将link更改为备份中的位置
完成后,我 运行 'symlinks -c folder' 将所有绝对路径更改为相对路径。