Chciałbym rekurencyjnie konwertować miękkie linki na twarde linki w katalogu. Próbowałem czegoś takiego:
for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
… Ale ma dwa główne problemy:
- nie rekurencyjne
- pobiera pliki, które nie są dowiązaniami symbolicznymi
Byłoby miło jakoś nakarmić powyższą linię find -type l
, ale nie jestem pewien, jak to zrobić.
bash
find
symbolic-link
Attila O.
źródło
źródło
cp -aH
). [1]: unix.stackexchange.com/questions/94185/...Odpowiedzi:
To polecenie powinno działać:
Jak to działa:
find -type l
znajdzie wszystkie linki w bieżącym katalogu.-exec bash -c '...' {} \;
wywołuje bash, aby wykonać...
.Przekazuje
{}
- nazwę aktualnie przetwarzanego łącza - jako argument, do którego bash może uzyskać dostęp jako$0
.readlink -m "$0"
zwraca bezwzględną ścieżkę miejsca docelowego dowiązania symbolicznego.ln -f "$(readlink -m "$0")" "$0"
overwrites (-f
) dowiązanie symboliczne$0
twardym dowiązaniem do celu.Jeśli z jakiegoś powodu nie można przekonwertować łącza, pozostanie ono nietknięte, a ln wydrukuje komunikat o błędzie.
źródło
bash
iln
?-e
przełącznik to naprawia.brew install coreutils
ifind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
.