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.
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.
Risposte:
È possibile utilizzare find
per elencare i file eseguibili:
find /foo -type f -executable
È quindi possibile utilizzare l' -exec
opzione 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 ~/bar
a 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.
man find
dice -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.
Un'altra possibilità:
for i in ~/foo/*; do [ -x "$i" ] && ln -s "$i" ~/bar; done
-x
verifica se il file esiste ed è eseguibile. Vedi man test
per maggiori informazioni.
Se si desidera creare collegamenti relativi funzionanti, potrebbe essere necessario pensare a come fornire i percorsi della directory o utilizzare l' -r
opzione 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 globstar
con shopt -s globstar
e fornisci il percorso di ricerca come ~/foo/**
(vedi globstar
nel 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.
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.