Come posso trovare un file per nome file nel terminale Mac OSX?


119

Voglio trovare un file sul mio Macbook con il nome del file: abc.dmg. Ho provato a usare i riflettori, ma non lo trova. Quando ho provato a trovare, e find -name abc.dmg -path /ho usato :, ho ricevuto degli errori.

Qual è la sintassi corretta per trovare un file per nome file con il comando find su un terminale Mac OSX?


1
@VxJasonxV Le domande di Apple sono al 100% in tema per Super User e non è necessario spostare tutte le domande di Apple lì. Le domande su iPhone o iPad verranno comunque spostate quando / se necessario.
BinaryMisfit,

Non era tanto un motivo per essere fuori tema, ma il fatto che ci fosse un argomento / sito più specifico per questo argomento generale.
VxJasonxV,

@Diago: C'è stata qualche discussione al riguardo su meta o chat? Mi chiedo solo perché AFAIK apple.SE uscirà dalla beta abbastanza presto, quindi sarebbe bello avere tutti sulla stessa pagina.
Robert S Ciaccio,

1
@calavera. Discussione abbastanza vecchia ma pertinente può essere trovata qui . Apple SE, Ubuntu SE e Linux SE sono tutti lì per complimentarmi con Super User, ma in nessun modo vogliamo forzare gli utenti a spostarsi. Preferisco porre qui le mie domande su Apple piuttosto che su Apple, poiché utilizzo 3 diversi sistemi operativi. Se ho una domanda molto specifica, la farò su un sito più specializzato.
BinaryMisfit il

Risposte:


164

Nella sua forma più semplice, findaccetta un parametro: il percorso. Nella sua forma effettivamente utile, prende il percorso seguito da criteri di restringimento.

Quindi, vuoi:

  • find (il programma)
  • / (il percorso) e
  • -name abc.dmg (il criterio).
find / -name abc.dmg

12
È possibile ottenere errori di tipo a cui è stato negato il permesso durante la ricerca sull'intera unità, ma possono essere ignorati a meno che non si preveda che il file si trovi in ​​una cartella con restrizioni. In tal caso, usa sudo find / -name abc.dmg
Chris Nava il

Ho provato, ma nessun risultato.
SPRBRN,

6
Presumibilmente quindi, non hai un file chiamato abc.dmg sul tuo computer. Puoi usare -iname invece di -name per rendere insensibile il caso di ricerca. Dubito fortemente che tu stia effettivamente cercando "abc.dmg", e dato quel fatto (presumibilmente), è difficile dirti quale sia il tuo problema senza avere i dettagli reali.
VxJasonxV,

2
@rxt: se trovare non lo trova, non è lì ...
Robert S Ciaccio,

5
Dato che il rapporto del PO ha cercato di trovare nel testo della domanda, vale la pena notare che l'ordine degli argomenti è find importante . Se deve essere find [path]+ [selection, grouping, and actions].
dmckee,

23

find . -name '*.csv'per esempio ha funzionato per me con i caratteri jolly. OP potrebbe anche usare find . -name '*.dmg'per controllare la sua directory corrente, supponendo che fosse in /.



6

Puoi usare il locatecomando

locate abc.dmg

2
Nota il osxtag. slocate db non viene popolato per impostazione predefinita.
VxJasonxV,

Ho provato, dopo aver creato il database, ma nessun risultato.
SPRBRN,

se locateed mdfindentrambi falliscono, è probabile che il file non sia sul tuo computer. O non è chiamato come pensi che sia chiamato. forse la ricerca di TUTTI i DMG potrebbe essere il tuo prossimo passo?
peelman,

3

Il modo più semplice (che sono sicuro che hai già provato, ma ehi, lascia che lo aggiunga al thread comunque) è quello di inserire abc.dmg nella casella di ricerca in alto a destra di qualsiasi finestra del Finder, quindi selezionare "File Nome "dalle opzioni sulla barra di ricerca che appare.

Non è necessario il terminale.

Ricorda inoltre che Spotlight indicizza solo le directory specificate nel pannello di controllo di Spotlight e abc.dmg potrebbe non trovarsi in una di quelle directory.

Correggimi se sbaglio, ma penso che il comando find abbia bisogno di sapere cosa produrre:

find / -name abc.dmg -print

... dovrebbe stampare tutti i risultati sul terminale (inclusi gli errori di autorizzazione).

Se non si desidera errori di autorizzazione e si desidera cercare altre directory utente, quindi:

sudo find / -name abc.dmg -print

2

È possibile utilizzare le seguenti funzioni della riga di comando per trovare e aprire rapidamente il file pertinente. Lo trovo più facile che scrivere una lunga stringa di query nella finestra di Spotlight.

Aggiungi le seguenti funzioni in ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Ora, source ~/.bash_aliaseso aprire una nuova funzione di caricamento del terminale. Per cercare file con parole, torta e 2016 ovunque nel nome del file, fare

spot pie*2016 #or
spot 2016*pie

Non è necessario anteporre o aggiungere *alla query come modello di ricerca, '*$1*'già tag all'inizio e alla fine della query come carattere jolly. Ulteriore cdè per maiuscole e minuscole e ignorando i segni diacritici, ad esempio, fredrestituirà sia Frédéric che FrEDeric.

findpaperlimiterà la ricerca ai risultati in un percorso specifico (ricorsivo) mentre openpaper pie*201aprirà un (o primo di più risultati) risultati della ricerca o openpaper pie*201 3aprirà la terza voce del risultato. Per evitare l'apertura di script bash o altri file non documentali, è possibile limitare il contenuto dei file mediante attributi di ricerca aggiuntivi. Vedere Sintassi di espressione di query di metadati di file e https://ss64.com/osx/mdfind.html per l'utilizzo di altri operatori di ricerca.


Eccezionale! Stilling: D
Atcold

0

Cattura un elenco di tutti i file sul disco come root da /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Cat l'intero file tramite grep per cercare l'intero disco:

cat ~/file-list.txt | grep abc.dmg

Usa le espressioni regolari per mostrare solo i file .jpg e .dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Risultato:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

...eccetera. Purtroppo catturerà anche tutti i dischi montati, quindi è meglio espellere quelli di Time Machine che hanno molti collegamenti. Quindi, in un'altra finestra, corro, il watch tail -n 10 ~/file-list.txtche mi mostra dove sta andando il mio trucco cattivo!


1
Cattive pratiche o cose che meritano alcuni commenti: (1) sudo find / > ~/file-list.txtsembra meglio che eseguire l'intera shell come root. (2) find *salterà gli oggetti nascosti (punto) (se presenti) in /. (3) &>è un basismo. (4) Uso inutile di cat. (5) grep abc.dmgstamperà ad es /foo/bar/123abcXdmg456/baz/whatever. // Una cosa positiva che la tua risposta porta a questo thread (e l'altra risposta no) è l'approccio in cui l'utente esegue finduna volta e quindi riutilizza il risultato salvato più volte senza interrogare ripetutamente il filesystem. Questo potenziale vantaggio non è accentuato però.
Kamil Maciorowski il

buon punto grazie Kamil, l'ho fatto e anche chown $ (whoami)
Tomachi il
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.