Найдите неработающую ссылку symboli c, затем найдите соответствующий файл в резервной копии и повторно установите ссылку - PullRequest
0 голосов
/ 19 июня 2020

У меня много неработающих символов c ссылок, которые указывают на файлы, которых больше не существует в этом месте, я могу найти их все с помощью этой единственной строки:

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

Теперь у меня есть резервная копия связанных файлов в другом месте, и я хотел бы использовать результат первой строки, чтобы найти файл SHA256E-s4214107462--c36267de6b6d438d1ea9c0f262be5a873aaffdf8845a42377e159db6a71b404d.gz в резервной копии и заменить исходная ссылка на что-то вроде этого

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

Как я могу это сделать? Спасибо.

1 Ответ

0 голосов
/ 22 июня 2020

Это не самый красивый, но он работает.

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*\).*$/\1/p') #extract filepath by looking for " ./"
        oldlinkpath=$(echo "$item" | sed -n 's/^.*>\s*\(\S*\).*$/\1/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. найти все битые ссылки
  2. извлечь путь неработающей ссылки
  3. найти имя файла связанной файл
  4. найти связанный файл в резервной копии по его имени
  5. изменить ссылку на место в резервной копии

Как только все будет сделано, я запускаю 'символические ссылки - c папка' чтобы заменить все абсолютные пути на относительные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...