C'è un modo per impostare collegamenti simbolici solo ai file eseguibili in Linux?


3

Ho una directory con file di codice e file eseguibili e voglio sapere come creare un collegamento simbolico solo ai file eseguibili in quella directory?

So che path-of-directory/*seleziona tutti i file ma voglio solo gli eseguibili.


1
La nozione di eseguibilità è ovviamente negli occhi di chi guarda
Hagen von Eitzen,

Risposte:


6

È possibile utilizzare findper elencare i file eseguibili:

find /foo -type f -executable 

È quindi possibile utilizzare l' -execopzione per creare il collegamento.

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command [...]

Quindi, per creare un collegamento ~/bara ciascun file eseguibile ~/foo, lo faresti

find ~/foo -type f -executable -exec ln -s {} ~/bar \;

Si noti che questo non è alla ricerca di file binari, semplicemente per quelli con il bit eseguibile impostato.


Grazie, ho provato il tuo metodo e funziona come volevo!
tony_pt,

@tony_pt sei il benvenuto. Se questa risposta ha risolto il problema, prenditi un momento e accettalo facendo clic sul segno di spunta a sinistra. Questo segnerà la domanda come risposta ed è il modo in cui i ringraziamenti sono espressi sui siti di Stack Exchange.
terdon,

Cosa man finddice -executable: "Poiché questo test si basa solo sul risultato della chiamata di sistema di accesso (2), non vi è alcuna garanzia che un file per il quale questo test ha esito positivo possa essere effettivamente eseguito". Tuttavia, questa precauzione è probabilmente irrilevante per la media dei file di Joe su un disco locale.
Hagen von Eitzen,

@HagenvonEitzen sì, è per questo che chiarisco che questo cercherà solo i file che hanno il bit eseguibile impostato alla fine della mia risposta.
terdon,

4

Un'altra possibilità:

for i in ~/foo/*; do [ -x "$i" ] && ln -s "$i" ~/bar; done

-xverifica se il file esiste ed è eseguibile. Vedi man testper maggiori informazioni.

Se si desidera creare collegamenti relativi funzionanti, potrebbe essere necessario pensare a come fornire i percorsi della directory o utilizzare l' -ropzione per ln(che è un'estensione GNU piuttosto nuova (≥ 8.16), ma dovrebbe essere presente in tutte le distribuzioni "recenti") .

Se vuoi attraversare le sottodirectory usando questo metodo, attiva globstarcon shopt -s globstare fornisci il percorso di ricerca come ~/foo/**(vedi globstarnel manuale di Bash).

Il [ -x ]test includerà le directory con il set di bit eseguibile, che potrebbe non essere desiderato. Se si tratta di un problema, [ -f ]è possibile aggiungere un test aggiuntivo per vedere se la corrispondenza è un file.


1

Se usi zsh (e ti consiglio di provarlo per magia come questa), puoi semplicemente usare un qualificatore glob .

ln -s /path/to/foo/*(*) /path/to/bar

(*)significa solo file eseguibili; puoi usare costruzioni simili per file, directory, collegamenti, ecc. o anche operazioni di ordinamento e manipolazione ancora più avanzate.

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.