2011-12-22 11 views
36

Ho un file /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/HomeTrovare tutti i file con determinate estensioni in Unix?

sto cercando di trovare se ho il * .jdk altrove sul mio disco rigido. Così faccio un comando di ricerca:

find . -name "*.jdk" 

Ma non trova nulla. Nemmeno quello che so di avere. Come mai?

risposta

70

find . cerca solo nella directory corrente. Se si dispone delle autorizzazioni per cercare i file in altre directory (accesso root) quindi è possibile utilizzare il seguente per trovare il file -

find/-type f -name "*.jdk" 

Se hai trovato tonnellate di permesso negato messaggi allora si possono sopprimere che facendo

find/-type f -name "*.jdk" 2> /dev/null 
+3

@Prostak, questo mostrerà solo file regolari, non directory. '-type f' è quello di filtrare collegamenti simbolici, directory, dispositivi e così via. – BRFennPocock

+0

Segnalo come risposta corretta. Ma grazie a tutti e due per il vostro aiuto! – Prostak

4

Probabilmente i tuoi JDK sono maiuscoli e/o la versione di find disponibile su OS X non è impostata su -print se non viene specificata alcuna azione; provare:

find . -iname "*.jdk" -print 

(-iname è come -name ma esegue una corrispondenza case-insensitive; -print dice a find di stampare i risultati)

--- EDIT ---

Come notato da @Jaypal, ovviamente find . ... guarda solo nella directory corrente (e nelle sottodirectory), se si desidera cercare nell'intero disco è necessario specificare / come percorso di ricerca.

+1

Perché devi usare '-print', isn' t il valore predefinito? –

+1

@giannischristofakis: appena controllato lo standard POSIX, sì, è l'impostazione predefinita; probabilmente l'ho scritto esplicitamente perché temevo fosse un GNUismo a cui ero abituato (per esempio, in GNU find puoi anche escludere il '.', mentre IIRC in BSD lo trova necessario). –

2

Il "." stai usando è la directory corrente. Se stai iniziando nella tua directory home, probabilmente mancheranno i file JDK.

peggiore di ricerca caso è quello di iniziare dalla radice

find/-name '*.jdk' -o -name '*.JDK' -print 

Altrimenti sostituire '/' con un po 'il percorso si è certi dovrebbe essere genitore a voi file JDK.

Spero che questo aiuti.

8

a/

find . mezzi, "trova (a partire nella directory corrente)." Se si desidera eseguire ricerche nell'intero sistema, utilizzare find /; per la ricerca sotto /System/Library, utilizzare find /System/Library, ecc

b/

E 'più sicuro di utilizzare le virgolette singole intorno jolly. Se non ci sono file con nome *.JDK nella directory di lavoro quando si esegue questo, allora find otterrà una riga di comando di:

find . -name *.jdk 

Se, tuttavia, vi capita di avere file junk.jdk e foo.jdk nella directory corrente quando lo si esegue, find sarà invece essere avviato con:

find . -name junk.jdk foo.jdk 

... che (dato che ci sono due) lo confondono, e farla errore fuori. Se si elimina foo.jdk e fare di nuovo la stessa identica cosa, devi avere

find . -name junk.jdk 

... che non sarebbe mai trovare un file di nome (per esempio) 1.6.0.jdk.

Ciò che probabilmente si desidera, in questo contesto, è

find /System -name '*.jdk' 

... oppure, è possibile "fuga" del * come:

find /System -name \*.jdk 
Problemi correlati