Mam aplikację internetową, która zawiera wiele dowiązań symbolicznych w podkatalogach. Muszę przenieść aplikację do innej struktury katalogów i muszę zaktualizować wszystkie dowiązania symboliczne, aby wskazywały nową ścieżkę. Na przykład:
Stary katalog: /home/user/public_html/dev
Nowy katalog: /home/user/public_html/qa
Stary symbol: /home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/dev/images
Nowy symbol:/home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/qa/images
Problem polega na tym, że jest ich wiele w różnych katalogach. Jak mogę rekurencyjnie wyszukiwać od katalogu głównego i ponownie tworzyć wszystkie dowiązania symboliczne wskazujące za /dev/
pomocą /qa/
?
źródło
find /home/user/public_html/qa/ -type l -lname '/home/user/public_html/dev/*'
nic nie wyświetla.find /home/usr/public_html/qa/ -type l
? Jeśli to nie znajdzie linków, w twoim systemie dzieje się coś bardzo dziwnego.find /home/user/public_html/qa/ -type l
” wyświetla linki. Ale dodanie parametru -lname niczego nie wyświetla.Jeśli ktoś inny znajdzie to podczas szukania rozwiązania: Utwórz plik o nazwie „linkmod.sh” zawierający:
i biegnij
W razie potrzeby możesz użyć opcji -lname w find.
UWAGA: musisz użyć 2x \ we wzorach przed dowolnymi znakami, które wymagają \ w sed, ponieważ echo usuwa jeden. Na przykład
Usuń
echo
ostatni wiersz, jeśli polecenia ln są poprawne.źródło
echo
w ostatnim wierszu skryptu orazecho
wfind .. | xargs .. linkmod.sh ...
poleceniu samego obie muszą zostać usunięte.Stworzyłem skrypt bash
link_rename.sh
dla rekurencyjnej zmiany nazw dowiązań symbolicznych w danym kataloguMożna go wykonać jako
link_rename.sh /home/human/dir link1 link2
Skrypt ma 3 argumenty:
link1
stary wzór, który zostanie zastąpionylink2
nowy wzór, którylink1
zostanie zastąpionySkrypt rekurencyjnie odczytuje wszystkie dowiązania symboliczne w katalogu przy użyciu
find "$DIR" -type l
i przetwarza je wiersz po wierszu.$line
jest dowiązaniem symbolicznym, którego nazwę należy zmienićCUR_LINK_PATH
to stara ścieżkaNEW_LINK_PATH
jest uzyskiwany przez wykonanie zamiany łańcucha na starej ścieżce łącza.Stare symlink jest usuwane i nowe symlink jest tworzone przy użyciu
ln -s "$NEW_LINK_PATH" "$line"
źródło
Skończyło się na napisaniu skryptu PHP w wierszu poleceń, który wydaje się załatwić sprawę.
źródło