Puncte:0

Cum pot căuta link-uri simbolice care indică alte link-uri simbolice?

drapel ng

Am o grămadă de legături simbolice înlănțuite ca acesta împrăștiate:

A (legatură simbolică) -> B (legatură simbolică) -> C (fișier)

Unele pot implica chiar lanțuri mai lungi, încă nu sunt sigur.

Când examinez manual un singur fișier, este ușor să vezi ce se întâmplă, dar caut o modalitate automată de a le găsi și (de preferință) de a le curăța.

În exemplul de mai sus, aș dori ca legătura simbolică B->C să rămână pe loc, dar legătura simbolică A->B ar deveni A->C

Identificarea lor dacă scopul principal; cantitatea ar putea ajunge să fie suficient de mică încât să le repari manual să nu fie mare lucru. Dar găsirea lor pe toate manual nu este fezabilă.

Sunt conștient de utilitarul „legături simbolice” și este util în multe scenarii, cum ar fi găsirea de legături simbolice atârnate, dar nu pare să aibă capacitatea de a detecta „lanțuri” ca acesta

Sunt conștient de „find -type l”, precum și de opțiunea -L pentru find, dar nu par să funcționeze împreună, deoarece „find -L -type l” returnează întotdeauna un răspuns gol.

Folosesc "find -type l -exec ls -l {} +" (care funcționează mai bine decât opțiunea -ls a find) și am încercat să o folosesc pentru a obține o listă de destinații de linkuri simbolice pe care le-am putut verifica apoi pentru a vedea dacă sunt sunt sau nu legături simbolice, totuși, toate legăturile simbolice sunt relative mai degrabă decât absolute, astfel încât rezultatul este puțin dezordonat

de exemplu, am ieșiri ca aceasta:

lrwxrwxrwx 1 nume de utilizator 50 nov 5 01:00 ./a/b/c/d -> ../../e/f/g/h

De aici trebuie să mă gândesc puțin pentru a-mi da seama că destinația reală a link-ului simbolic este ./a/e/f/g/h (și pot verifica apoi dacă este sau nu un link simbolic), nu chiar ideal pentru automatizare

Dacă legăturile simbolice ar fi (temporar) absolute mai degrabă decât relative, acest lucru ar fi mai ușor, dar utilitarul „legături simbolice” poate converti doar absolut -> relativ; din câte îmi pot da seama, nu poate converti relativ -> absolut.

Puncte:1
drapel nl

Urmărind întregul lanț de zale

cale reală

cale reală (1) vă oferă destinația absolută a unui link. Dar îți oferă doar final destinație, așa că dacă aveți un lanț de legături, acesta vă va arăta doar calea ultimului fișier/dosar real către care în cele din urmă indică lanțul.

Deci, în cazul tău, dacă ../../e/f/g/h este fișier sau folder real, veți vedea calea absolută. Dar dacă una dintre componente este și o legătură simbolică, se va păstra recursiv până când rezolvă toate legăturile simbolice din cale.

readlink

Ai putea folosi, de asemenea readlink(1) comanda cu steaguri -f sau -e, care vă va oferi un rezultat similar cu cale reală.

  -f, --canonicalize canonicalize urmând fiecare legătură simbolică în
                                fiecare componentă a numelui dat în mod recursiv;
                                toate, în afară de ultima componentă, trebuie să existe
  -e, --canonicalize-existing canonicalize urmând fiecare link simbolic în
                                fiecare componentă a numelui dat în mod recursiv,
                                toate componentele trebuie să existe

Evitați să urmăriți întregul lanț de zale

Dacă am înțeles bine, nu doriți să urmați lanțul până la ultima componentă, ci să obțineți doar calea absolută a verigii reale. Este puțin urât, dar poți face ceva de genul:

LINK=./a/b/c/d
/usr/bin/realpath --no-symlinks „$(dirname ${LINK})/$(readlink ${LINK})”

Explicaţie:

$ dirname $LINK # dirname ./a/b/c/d
./a/b/c

$ readlink $LINK # readlink ./a/b/c/d
../../e/f/g/h

$ echo „$(dirname ${LINK})/$(readlink ${LINK})” 
./a/b/c/../../e/f/g/h

$ /usr/bin/realpath --no-symlinks „$(dirname ${LINK})/$(readlink ${LINK})”
/home/a/e/f/g/h

Dacă doriți să vedeți doar linkul referitor la CWD, puteți adăuga argumentul --relative-to:

$ /usr/bin/realpath --no-symlinks --relative-to ./ „$(dirname ${LINK})/$(readlink ${LINK})”
a/e/f/g/h

Folosind find

Puteți obține argumentul pentru comanda realpath pe care am arătat-o ​​înainte utilizând comanda find:

$ find ./ -type l -printf „%h/%l\n”
./a/b/c/../../e/f/g/h

De la om găsi:

%h directoarele principale ale numelui fișierului (toate cu excepția ultimului element). Dacă
       numele fișierului nu conține bare oblice (din moment ce este în versiunea curentă
       directorul) specificatorul %h se extinde la „.”.

%l Obiect al legăturii simbolice (șir gol dacă fișierul nu este o legătură simbolică).

Apoi îl puteți combina cu comanda realpath de sus.

$ find ./ -type l -printf „%h/%l\n” | xargs /usr/bin/realpath -s
/home/a/e/f/g/h

Dacă doriți să vedeți doar linkul referitor la CWD:

$ find ./ -type l -printf „%h/%l\n” | xargs /usr/bin/realpath -s --relative-to ./
a/e/f/g/h
Displayname71 avatar
drapel ng
Interesant... faptul că urmărește lanțul până la sfârșit nu este ideal, dar s-ar putea să pot face referințe încrucișate la ieșirea realpath cu informațiile țintă de pe „ls -l” pentru a vedea dacă se potrivesc
aviro avatar
drapel nl
Mi-am editat răspunsul și am adăugat o altă opțiune, ultima ar putea fi ceea ce cauți.
aviro avatar
drapel nl
@Displayname71, am adăugat câteva opțiuni la răspunsul meu, sper că una dintre ele se va potrivi nevoilor dvs

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.