Come faccio a trovare i collegamenti simbolici più seguiti, ma non tutti?


10

Il mio sistema operativo e la mia home directory sono su un SSD. Conservo alcuni file di grandi dimensioni su un disco rigido e un collegamento simbolico dalla mia directory principale al disco rigido (ad es. ~ / Videos / Films è un collegamento simbolico a / mnt / hdd / Films). Ho anche un certo numero di prefissi Wine, ognuno dei quali ha dosdevices / z: collegato a /.

Quindi, se ho usato find senza -L, mancherebbe tutto ciò che è sul disco rigido. Ma se uso find con -L, finisce in loop a causa del link simbolico di Wine a /.

Esiste un modo sensato di risolverlo, in modo che trovi le ricerche dove voglio? Intuitivamente, desidero qualcosa sulla falsariga di "seguire i collegamenti simbolici, a meno che non si trovino in una directory chiamata dosdevices". "Seguire i collegamenti simbolici a qualcosa sul disco rigido" funzionerebbe anche.

Risposte:


11

Il -pruneprimario dice di findnon ricorrere in una directory.

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

Se si desidera utilizzare -lnamenella propria condizione, non è possibile utilizzare l' -Lopzione, poiché la -Lmaggior parte dei predicati agisce sulla destinazione del collegamento, incluso -lname. La mia raccomandazione in tal caso sarebbe quella di utilizzare sia la tua home directory che la radice del disco rigido come radice della tua ricerca.

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

Potresti correre find ~ -type l …per raccogliere un elenco di collegamenti simbolici e usarli come radici aggiuntive.

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

Se vuoi davvero ricorrere sotto link simbolici, puoi escludere specifici link simbolici per target anziché per nome. Tuttavia, puoi solo escludere un elenco finito, non un modello o una sottostruttura in questo modo.

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

Puoi usare altri criteri come ! -writable(file per i quali non hai il permesso di scrivere), ma non credo che GNU find abbia un modo di ricorrere sotto i collegamenti simbolici solo se il loro testo di destinazione corrisponde a una determinata espressione.

È possibile creare un findcomando che fa quasi ciò che si desidera, tranne per non escludere abbastanza collegamenti simbolici, eseguire find2perl per convertire la query in uno script Perl e modificare un po 'lo script Perl. Tuttavia, ci sono molti switch di GNU che find2perl non riconosce.


Grazie! -pruneè proprio il genere di cosa che stavo cercando. Ho scoperto che find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype delenca tutti i collegamenti simbolici che non voglio seguire; Ora sto cercando di trovare un modo per usare quella query per potare.
Mark Raymond,

@MarkRaymond Il principio generale è find ~ <negative criteria> -prune -o <positive criteria> -print, quindifind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
Gilles 'SO- smetti di essere malvagio'

@Giles - che funziona bene senza -L, ma una volta aggiunto -L, le espressioni -lname non funzionano più (come dice la pagina man che non lo faranno). Quindi sostanzialmente ho bisogno di alcune condizioni per seguire i symlink e altri no!
Mark Raymond,

Non riesco a pensare a un modo di fare esattamente quello che vuoi con find. Vedi la mia modifica per alcune approssimazioni.
Gilles 'SO- smetti di essere malvagio' il

1

Per cercare TUTTI i link, questo ha funzionato per me:

find -L . -name \*.txt

0

Quanti link simbolici ai dischi rigidi hai? Se non ci sono troppe soluzioni, non utilizzare "-L" specificando esplicitamente i collegamenti simbolici che si desidera seguire sulla riga di comando Trova. Qualcosa di simile a:

find .  ~/Videos/Films -name '*file I want*' ...

Questo cercherà la directory corrente (".") Così come il link simbolico "~ / Videos / Films" ma non scenderà in altri link simbolici.


0

Un'altra soluzione che risolve il problema (almeno per il mio caso) è quella di utilizzare i mount bind anziché i collegamenti simbolici per le directory sul disco rigido. Questo viene fatto aggiungendo voci in /etc/fstabquesto modo:

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.