Come posso trovare solo i file eseguibili in una determinata directory in Linux?


157

Come posso trovare solo i file eseguibili in una determinata directory in Linux?


Qui è una sorta di script bash, non è male, è quello che posso dire :) stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar

Che dire dell'utilizzo del filecomando standard ?
Breakthrough

5
Per chiunque voglia farlo su un Mac (testato su OS X 10.9.5): ls -l | egrep '^[^d]..x..x..x.*$' Quanto sopra elencherà tutti gli eseguibili (per tutti / utente e gruppo) nella directory corrente. Nota : l' -executableopzione non funziona su un Mac, quindi la soluzione sopra descritta.
techfoobar,


1
@techfoobar: la domanda è ambigua: significa file che contengono codice eseguibile o file con autorizzazione eseguibile? Ma anche se supponiamo che l'autorizzazione eseguibile sia ciò che si desidera (come sembra la maggior parte delle risposte), la domanda non dice eseguibile a livello mondiale . La tua soluzione troverà i file (e anche i quindici, i socket, i symlink, ecc.) Che dispongono dell'autorizzazione all'esecuzione mondiale, ma non 750 ( -rwxr-x---), che è ancora eseguibile da alcuni utenti.
G-Man,

Risposte:


157

Il controllo dei file eseguibili può essere eseguito con -perm(non consigliato) o -executable(consigliato, poiché tiene conto dell'ACL). Per usare l' -executableopzione:

find <dir> -executable

se si desidera trovare solo file eseguibili e directory non ricercabili, combinare con -type f:

find <dir> -executable -type f

23
uno shebang non significa che siano eseguibili. ci dice solo quale interprete usare. e per definizione di Linux i "file eseguibili" sono file con il bit eseguibile (x) impostato
knittl

2
Quale versione di find supporta quel tipo di -type? man trova le liste b, c, d, p, f, l, se D sul mio sistema.
InnaM,

2
Lo stesso qui, la mia scoperta non ha -type xnemmeno uno.
dav

7
Se si dispone di una versione precedente di find (probabilmente precedente alla 4.3.8) che non dispone di -executable use find. -perm / u = x, g = x, o = x.
Ludwig Weinzierl,

8
find: invalid predicate -executable'su RHEL
SSH Questo

33

Usa l' -permopzione di ricerca. Questo troverà i file nella directory corrente che possono essere eseguiti dal loro proprietario, dai membri del gruppo o da altri:

find . -perm /u=x,g=x,o=x

Modificare:

Ho appena trovato un'altra opzione presente almeno in GNU find 4.4.0:

find . -executable

Questo dovrebbe funzionare anche meglio perché vengono considerati anche gli ACL.


2
Funziona solo con una versione più recente di find. Quello che viene fornito di default con CentOS fornisce l'errore find: invalid mode / u = x, g = x, o = x'`
davr

12
Quindi dovresti provare la versione "-perm +" che ora è deprecata in GNU find: find. -perm +111 "
innaM

Sembra che -perm /111potrebbe essere la versione più portatile.
Scott,

12

So che la domanda menziona specificamente Linux, ma dal momento che è il primo risultato su Google, volevo solo aggiungere la risposta che stavo cercando (ad esempio se sei - come me al momento - costretto dal tuo datore di lavoro a usare un non GNU / Sistema Linux).

Testato su macOS 10.12.5

find . -perm +111 -type f

1
Funziona anche con RHEL 5.
José Tomás Tocino,

Questa è l'unica variante che potrei ottenere lavorando su OS X 10.14, grazie
Justin il

3

Ho un altro approccio, nel caso in cui quello che vuoi davvero sia solo fare qualcosa con i file eseguibili - e non necessariamente forzare effettivamente la ricerca per filtrare se stesso:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

Preferisco questo perché non si basa su -executablequale sia specifico della piattaforma; e non dipende da -permquale sia un po 'arcano, un po' specifico per la piattaforma, e come scritto sopra richiede che il file sia eseguibile per tutti (non solo per te).

Il -type fè importante perché in * nix directory devono essere eseguibile per essere attraversabile, e più della query è nel findcomando, il più efficiente della memoria il vostro comando sarà.

Ad ogni modo, solo offrendo un altro approccio, poiché * nix è la terra di un miliardo di approcci.


(0) Quale preferisci, arcano e corretto o intuitivo e imperfetto? Preferisco corretto. (1)  La risposta di innaM , che presenta find -perm, trova i file con qualsiasi bit di autorizzazione impostato. (2) Al contrario, questa risposta trova solo i file per i quali l'utente corrente ha il permesso di esecuzione. Certo, potrebbe essere quello che vuole l'OP, ma non è chiaro. ... (proseguendo)
Scott,

(Proseguendo) ... (3) Per maggiore chiarezza, potresti voler passare `…`a $(…)- guarda questo , questo e questo . (4) Ma non farlo for i in $(find …); do …; non riesce su nomi di file che contengono spazi. Invece, fallo find … -exec …. (5) E, quando lavori con variabili shell, citale sempre (tra virgolette doppie) a meno che tu non abbia una buona ragione per non farlo e sei sicuro di sapere cosa stai facendo.
Scott,

@scott OK, sono corretto :) Ho letto l' -permargomento come richiedendo tutti e tre, non uno di loro. Inoltre, grazie per l'input sulla protezione degli argomenti della shell, sono tutte cose di cui non ero a conoscenza.
Mark McKenna,

@MarkMcKenna hai un errore di battitura: for i in trova. -tipo f ; do [ -x $i ] && echo "$i is executable"; done; ti manca la parte <dir>, che uso un punto (.)
Devy,

2

Un file contrassegnato come eseguibile non deve necessariamente essere un file o un oggetto eseguibile o caricabile.

Ecco cosa uso:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2
Cosa fa questo?
DerMike,

@DerMike, è uno dei modi per trovare il file eseguibile nella directory corrente, inclusi i file .so, anche se un file non è contrassegnato come eseguibile che può scoprire.
AjayKumarBasuthkar

Bene, voglio dire, come fa?
DerMike,

Legge dall'intestazione del file per scoprire, ogni file binario o file di script ha un'intestazione.
AjayKumarBasuthkar,

Per quanto ne so, -name "*"non ha alcun effetto find: normalmente trova tutti i file che non vengono eliminati dai test.
G-Man,

1

Come fan dell'unica fodera ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Usando 'xargs' per prendere l'output dal comando find (usando print0 per assicurarsi che i nomi dei file con spazi siano gestiti correttamente). Ora abbiamo un elenco di file eseguibili e li forniamo, uno per uno, come parametro per il comando 'file'. Quindi grep per il termine ASCII per ignorare i binari. Sostituisci -executable nel comando find con quale stile preferisci (vedi le risposte precedenti) o cosa funziona sul tuo sistema operativo NIX

Ho richiesto quanto sopra per trovare i file con eval negli script di proprietà di root, quindi ho creato quanto segue per aiutare a trovare i punti deboli dell'escalation priv in cui l'utente root esegue script con parametri non sicuri ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

Ciò non funzionerà se lo script contiene caratteri non ASCII. fileriporta la codifica, quindi uno script python può essere segnalato come a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF'potrebbe funzionare meglio per individuare i non binari.
xenoid,

0

~/.bashrcStasera ho creato una funzione per trovare i file eseguibili non nel percorso di sistema e non nelle directory:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

Il vantaggio è che cercherà tre distro Linux e un'installazione Windows in meno di un secondo in cui il findcomando richiede 15 minuti.

Per esempio:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

O per un'intera directory e tutti i suoi sottotitoli:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
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.