Trova tutti i file eseguibili all'interno di una cartella nel terminale


19

Ho una cartella myfolderche contiene un'enorme gerarchia di file / cartelle.
Come trovare tutti i file eseguibili all'interno di questa cartella?

Su Ubuntu funziona: find . -executable -type f

Ma Mac OS X Mavericks (che usa anche bash) non riesce a ottenerlo:

find: -executable: unknown primary or operator

Risposte:


29

Questo troverà tutti i file (non i collegamenti simbolici) con il set di bit eseguibile:

find . -perm +111 -type f

Questo troverà anche collegamenti simbolici (che sono spesso ugualmente importanti)

find . -perm +111 -type f -or -type l

Ecco come funziona il comando se non è ovvio:

  • find è ovviamente il programma find (:
  • .si riferisce alla directory in cui iniziare a trovare ( .= directory corrente)
  • -perm +111= con uno qualsiasi dei bit eseguibili impostati ( +significa "uno qualsiasi di questi bit", 111è l'ottale per il bit eseguibile su proprietario, gruppo e chiunque)
  • -type fsignifica che il tipo è un file
  • -or booleano OR
  • -type lindica che il tipo è un collegamento simbolico

2
È possibile utilizzare -Linvece di -or -type lcausare qualsiasi statchiamata effettuata findper restituire le statistiche del file collegato, non il collegamento stesso.
Ian C.

Il problema che ho riscontrato con questo approccio è che qualsiasi file può avere l'autorizzazione di esecuzione. Ad esempio, dopo aver scaricato alcuni file di testo da Windows, l'autorizzazione è incasinata.
Ivan Z. Xiao,

5

Non sono riuscito a far funzionare la risposta di Ian (10.6.8), ma quanto segue ha dato i risultati previsti:

find . -type f -perm +0111 -print

modifica aggiornamento

Anche questo sembra funzionare!

find . -type f -perm +ugo+x -print

Immagino che la "x" non abbia senso senza l'utente / gruppo / altri specificatori.


La sintassi simbolica deve essere nuova, grazie per averlo sottolineato. Ho aggiornato la mia risposta in modo che usi ottali ed è retrocompatibile con le versioni precedenti di OS X.
Ian C.

Stranamente, quella sezione della manpage 10.6 è esattamente la stessa di quella che hai citato ... il che è stato abbastanza per farmi scavare un po 'più a fondo e vedere cosa diavolo stava succedendo. Modificata la mia risposta sopra.
Kent,

2
Conclusione: la sintassi del comando BDS è strana.
Ian C.

3

Dalla pagina man per trovare in OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

Quindi hai bisogno di:

find . -type f -perm +0111 -print

Ricorda che OS X è basato su BSD , non su Linux, quindi i comandi Gnu a cui sei abituato nelle distribuzioni Linux (di cui findè uno di questi) non sono necessariamente gli stessi di OS X. Questo non lo è una differenza di shell, è una differenza di strumenti di utilità del sistema operativo / sistema operativo.


1

Una domanda molto vecchia, ne sono consapevole, ma cercando una soluzione potrei aver trovato una risposta migliore.

Il problema principale con l'utilizzo di "trova" è che si basa su un attributo impostato su eseguibile, anche se questo attributo è impostato per un file non eseguibile.

MacOS viene fornito con un pratico strumento da riga di comando " file", che visualizza le informazioni sui file, ad esempio:

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

Come puoi vedere, "MyProgram" è un eseguibile e ben indicato come tale. Poiché anche i vecchi eseguibili a 32 bit avranno la frase "eseguibile" in questo, i seguenti dovrebbero elencare tutti i veri eseguibili (binari):

file * | grep "executable"

Spero che questo possa essere utile a qualcuno che cerchi una risposta anche alla stessa domanda.

Nota: filenon sembra avere una funzione da ricorrere attraverso le sottodirectory.

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.