Alternativa da trovare? [chiuso]


30

Esiste un findprogramma alternativo con un'interfaccia CLI più convenzionale? findfunziona e si aspetta parametri in modo dolorosamente diverso dalla maggior parte degli altri programmi di utilità.

Chiarimento: sto cercando un programma che abbia per lo più le stesse funzionalità di trova con un'interfaccia a riga di comando che funziona e si sente come consigli a riga di comando POSIX (o almeno GNU).


7
GNU find non rispetta le linee guida POSIX (o GNU) per la riga di comando. Ad esempio, l'ordinamento dei parametri, le opzioni multi-carattere con un singolo trattino ecc. Sono diversi rispetto ai programmi conformi.
Tamás Szelei,

3
Lo so e posso sempre fare quello che intendo, in un modo o nell'altro. Di recente ho avuto modo di conoscere acke mi chiedevo se ci fosse anche un meglio find.
Tamás Szelei,

2
No. Vedi, non voglio un piccolo linguaggio di programmazione, ma una scoperta più semplice, intuitiva e coerente (anche se ciò significa la perdita di alcune funzionalità avanzate). Quando devo affrontare un compito che giustifica la scrittura di un programma, lo faccio.
Tamás Szelei,

2
find è sia coerente (vedi la mia risposta) che intuitivo. Non è che le primarie si chiamino strane. -exec significa eseguire, -print significa stamparlo, -name significa abbinare un nome. In pratica, i primi 3 e tipi coprono il 95% dei casi d'uso. Per tutti gli altri casi, c'è l'uomo che trova.
Mel,

3
@tamas Ho modificato un'ora fa e ti ho detto che non c'è alternativa se non individuare. E forse ls -R ci viene in mente. Altre alternative sono i programmi GUI che emulano find. Altrimenti devi specificare cosa vuoi che faccia la tua alternativa di ricerca. Walk dir alberi? Filtrare i nomi dei file? Ti dico quali file sono più recenti allora?
Mel,

Risposte:


11

Questo è un malinteso comune.

Trova segue la sintassi delle opzioni. Stai solo confondendo le espressioni primarie con le opzioni:

 find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
 [cmd][-->        options          <--] [--> arg0..argN  <--]

L'alternativa è individuare. Ma trova implementa la propria sintassi di espressione perché fornisce un set più ricco di opzioni di filtro e azione. Non c'è alternativa che possa fare lo stesso, semplicemente perché sarebbe ridondante.


5
Anche se è colpa mia, questo non risponde alla mia domanda.
Tamás Szelei,

Qual è la differenza tra expression (solo uno consentito?), Cmd (dito?), Options e args?
utente sconosciuto

@utente sconosciuto: il comando find implementa la propria sintassi delle espressioni. L'espressione, quando fornita, è l'ultimo argomento sulla riga di comando. Se assente, l'espressione si risolve in -print.
Mel,

Ah - ora vedo, [cmd] non sta seguendo [espressione], ma è una descrizione della riga prima.
utente sconosciuto

2
OP afferma che find"si aspetta parametri in modo dolorosamente diverso dalla maggior parte degli altri programmi di utilità". Dichiarate che OP è "confondere le espressioni primarie con le opzioni". La maggior parte degli altri programmi di utilità ha anche un concetto di "espressioni primarie"? In caso contrario, ciò non dimostra il punto di OP? E questa non è davvero la parte più strana dell'utilizzo find. Quale altra CLI comporta {}(che ovviamente deve essere sfuggito in qualche modo)?
Kyle Strand,

10

Dipende dalla precisa funzionalità di findcui ti stai fidando. Se è (principalmente) la funzionalità di ricerca, alcune shell supportano globi ricorsivi. Ad esempio, con zsh:

% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c 
a/bar.c  a/b/foo.c  baz.c

Zsh ha molte più possibilità di ricerca attraverso i qualificatori di glob (guarda verso la fine di man zshexpn). Per esempio:

ls -l **/*(.)  ≈   find -type f -ls
ls *(m-2u:$USER:)  ≈  find -mtime -2 -user $USER

Bash 4 ha anche **/(è necessario abilitarlo con shopt -s globstar), ma niente come i qualificatori glob.


10

Vorrei dare un'occhiata locate. Esaminerà il suo database di file e stamperà rapidamente i nomi dei percorsi che corrispondono a ciò che dai.

kevin@box:~$ locate odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
/usr/share/gimp/2.0/help/en/gimp-tool-dodge-burn.html
....
kevin@box:~$ locate .odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
kevin@box:~$ 

Come puoi vedere, è una corrispondenza del sottotesto: se lo dai odg, allora corrisponderà a d odg e. Ma se lo dai .odg, allora non lo farà.

C'è un aspetto negativo, però: ha bisogno di un database. Questo database deve essere aggiornato quando le cose cambiano. La mia installazione di Fedora 13 ha messo questo in un crontab quotidiano, però.


Adorolocate
Andrew Lambert,

1
Inoltre, individuare accetta anche modelli (l'ho imparato solo di recente).
Adam Byrtek,

5

Cosa stai cercando di trovare? Se di solito cerchi file di codice sorgente, dai un'occhiata ack. È fondamentalmente uno strumento di ricerca del codice sorgente, ma l' -finterruttore di ack troverà i file che corrispondono a un determinato tipo di file.

Quindi se vuoi trovare tutti i file Perl in una directory, ad esempio, basta:

ack -f --perl

Se non ti piacciono i tipi di file che ack riconosce, puoi aggiungere i tuoi nel tuo ~/.ackrc.

ack non è un cercatore di file per scopi generici come find, ma se stai lavorando con il codice sorgente, può essere molto utile.


1
Questo non è ciò che l'utente ha chiesto, ma le persone potrebbero trovare molto utile per trovare nel codice sorgente (come grep) The Silver Searcher , silversearcher-agpacchetto sulle distribuzioni principali.
Pablo A

-1

Una delle grandi cose che ogni programmatore dovrebbe imparare è: se non riesci a trovare uno strumento, costruisci il tuo!

#!/usr/bin/bash
find -name $<

Potrei scriverne una migliore, con -tper filtrare i tipi, ecc.

Modifica : quanto sopra è uno script Bash. Prende l'argomento della riga di comando e lo passa per trovare il valore dell'opzione -name. Solo un semplice esempio. Da quando ho inserito questa risposta, ho trovato questo script Python:

https://github.com/sjl/friendly-find/

L'interfaccia sembra carina, ma non ho testato le sue prestazioni. Potrebbe valere la pena di provarlo.


1
Vero per la creazione dell'istruzione del proprio strumento. Ma almeno spiega come dovrebbe funzionare la tua piccola sceneggiatura.
jippie il

1
$<non sta facendo nulla di utile nel mio Bash. Cosa ti aspetti che faccia? Intendi "$@"davvero? O "$1"(che è fondamentalmente cosa significa questo in un Makefile)?
triplo

1
@tripleee - $<è l' cshequivalente di read- Immagino che intendesse questo.
DarkHeart,

-2

Il modo più standard per trovare cose in unix.

du -a <directory>|grep <pattern>| awk  '{print $2}'

1
grep | awkè un antipasto. Vedi l' uso inutile digrep . Se vuoi parametrizzare il modello, forsedu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee

@tripleee Queste sono informazioni molto utili awk, ma uno dei grandi vantaggi della filosofia UNIX è che non è necessario comprendere tutte le funzionalità degli strumenti più complessi (come awke find) al fine di costruire pipeline in grado di eseguire il desiderato compito. grep | awkpotrebbe non essere ottimale (o, su un sistema multithread con prestazioni altamente ottimizzate grep, forse lo sarebbe!), ma è semplice .
Kyle Strand,
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.