Переместить файл и все его ссылки

Для разрабатываемых тем значков у меня есть разные файлы с разным количеством символических ссылок, размещенных в разных папках. Вот пример одного из них:

FlatWoken/FlatWoken/scalable/apps$ find -L ../ -samefile bluetooth-active.svg 
../stock/stock_bluetooth.svg
../status/bluetooth-active.svg
../status/blueman-active.svg
../apps/bluetooth-active.svg
../apps/blueradio-48.svg
../apps/bluetooth.svg
../apps/bluedun.svg
../apps/bluetoothradio.svg
../apps/preferences-system-bluetooth.svg
../apps/blueman.svg

Я хотел бы найти терминальную команду, которая может переместить все из них в новую папку (скажем, FlatWoken / FlatWoken / 24x24), без потери символических ссылок (т. Е. FlatWoken / FlatWoken / 24x24 / apps / bluedun.svg должны символически ссылаться на FlatWoken / FlatWoken / 24x24 / apps / bluetooth-active.svg). Можно ли это сделать?

Для большей ясности, если у меня есть такая структура:

alecive@calliope:~/Scrivania/temp$ ls *
dest:
a

orig:
a  b  c
alecive@calliope:~/Scrivania/temp$ ls -l orig/*
orig/a:
totale 0
lrwxrwxrwx 1 alecive alecive 8 apr  9 10:22 link_a -> truefile
-rw-rw-r-- 1 alecive alecive 0 apr  9 10:22 truefile

orig/b:
totale 0
lrwxrwxrwx 1 alecive alecive 13 apr  9 10:23 link_b -> ../a/truefile

orig/c:
totale 0
lrwxrwxrwx 1 alecive alecive 13 apr  9 10:23 link_c -> ../a/truefile

alecive@calliope:~/Scrivania/temp$ ls -l dest/*
dest/a:
totale 0
-rw-rw-r-- 1 alecive alecive 0 apr  9 10:24 truefile

dest/b:
totale 0

dest/c:
totale 0

Я хотел бы заполнить папку dest символическими ссылками, указывающими на dest/a/truefile (а не orig/a/truefile), без использования абсолютного пути, а только относительного пути.

Заранее благодарю за любую помощь!

3
задан 19.05.2020, 14:23

1 ответ

Усовершенствованный материал . Используйте в своем риске! Необходимо будет изменить его наверняка. Не используйте, если Вы не понимаете его.

, Если можно жить с абсолютными символьными ссылками, можно сделать это. Предположим, что Вы запускаете с этого:

[:~/tmp] % ls -l a b c orig 

a:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr  1 16:53 linka -> ../orig/truefile

b:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr  1 16:53 linkb -> ../orig/truefile

c:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr  1 16:53 linkc -> ../orig/truefile

orig:
total 0
-rw-rw-r-- 1 rmano rmano 0 Apr  1 16:52 truefile

и Вы хотите переместить ссылки под ./dest...

Делают целевой dir: mkdir dest

тогда можно использовать этот сценарий (сохраните его как script.sh, удалите эхо в для цикла после того, как проверка делает корректную вещь):

#! /bin/bash
#
# $1 is the "true" file name, $2 the dest directory
# note both must exist, no check done! Let as an exrecise!
#
# put absolute path in $absf
absf="$(readlink -f "$1")"
#
# loop over all of the links we found under ".". Avoid the true file. 
# Print instructions; remove the echo if you want to execute them 
# (after checking, rm is not reversible) 
#
for i in $(find -L . -samefile $1 | grep -v $1); do
        echo  ln -s $absf "$2"/"$(basename "$i")"
        echo  rm "$i"
done

... и выполненный это как ./script.sh orig/truefile dest/. Это выполнится

ln -s /home/rmano/tmp/orig/truefile dest/linkb
rm ./b/linkb
ln -s /home/rmano/tmp/orig/truefile dest/linka
rm ./a/linka
ln -s /home/rmano/tmp/orig/truefile dest/linkc
rm ./c/linkc

, и Вы будете иметь:

[:~/tmp/dest] % cd dest; ls -l 
total 0
lrwxrwxrwx 1 rmano rmano 30 Apr  1 17:19 linka -> /home/rmano/tmp/orig/truefile
lrwxrwxrwx 1 rmano rmano 30 Apr  1 17:18 linkb -> /home/rmano/tmp/orig/truefile
lrwxrwxrwx 1 rmano rmano 30 Apr  1 17:19 linkc -> /home/rmano/tmp/orig/truefile

при необходимости в относительной символьной ссылке это будет более сложно. Можно проверить эта ссылка , чтобы начать кодировать...

0
ответ дан 19.05.2020, 14:24
  • 1
    I' ve отредактировал исходное сообщение:) – Lightness Races in Orbit 19.05.2020, 14:24

Теги

Похожие вопросы