Alternative zu finden? [geschlossen]

30

Gibt es ein alternatives findProgramm mit einer konventionelleren CLI-Schnittstelle? findfunktioniert und erwartet andere Parameter als die meisten anderen Utils.

Klarstellung: Ich suche ein Programm, das größtenteils die gleiche Funktionalität hat wie find mit einer Befehlszeilenschnittstelle, die funktioniert und sich wie POSIX (oder zumindest GNU) -Befehlszeilenempfehlungen anfühlt.

Tamás Szelei
quelle
7
GNU find beachtet nicht die POSIX- (oder sogar GNU-) Richtlinien für die Befehlszeile. Die Reihenfolge von Parametern, Optionen mit mehreren Zeichen mit einem einzigen Strich usw. unterscheidet sich beispielsweise von der Reihenfolge in konformen Programmen.
Tamás Szelei
3
Ich weiß, und ich kann immer das tun, was ich vorhabe, auf die eine oder andere Weise. Ich habe gerade erst erfahren ackund mich gefragt, ob es auch eine bessere gibt find.
Tamás Szelei
2
Sie sehen, ich möchte keine kleine Programmiersprache, sondern eine einfachere, intuitivere und konsistentere Suche (auch wenn dies den Verlust einiger erweiterter Funktionen bedeutet). Wenn ich vor einer Aufgabe stehe, die das Schreiben eines Programms rechtfertigt, tue ich das.
Tamás Szelei
2
find ist sowohl konsistent (siehe meine Antwort) als auch intuitiv. Es ist nicht so, als würden Vorwahlen seltsam genannt. -exec bedeutet Ausführen, -print bedeutet Drucken, -name bedeutet Übereinstimmungen mit einem Namen. In der Praxis decken die früheren 3 und -Typen 95% der Anwendungsfälle ab. Für alle anderen Fälle gibt es Menschenfund.
Mel
3
@tamas Ich habe es vor einer Stunde bearbeitet und dir gesagt, es gibt keine Alternative außer locate. Und vielleicht fällt mir -R ein. Andere Alternativen sind GUI-Programme, die find emulieren. Andernfalls müssen Sie angeben, was Ihre Suchalternative tun soll. Gehst du Bäume? Filtern von Dateinamen? Sagen Sie, welche Dateien dann neuer sind?
Mel

Antworten:

11

Dies ist ein weit verbreitetes Missverständnis.

Find folgt der Optionssyntax. Sie verwechseln nur Ausdrucksprimaries mit Optionen:

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

Die Alternative ist lokalisieren. Find implementiert jedoch seine eigene Ausdruckssyntax, da es eine größere Auswahl an Filter- und Aktionsoptionen bietet. Es gibt keine Alternative, die dasselbe tun könnte, nur weil sie überflüssig wäre.

Mel
quelle
5
Auch wenn es meine Schuld ist, beantwortet dies nicht meine Frage.
Tamás Szelei
Was ist der Unterschied zwischen Ausdruck (nur einer erlaubt?), Cmd (dito?), Optionen und Argumenten?
Benutzer unbekannt
@user unknown - Der Befehl find implementiert eine eigene Ausdruckssyntax. Der angegebene Ausdruck ist das letzte Argument in der Befehlszeile. Bei Abwesenheit wird der Ausdruck in -print aufgelöst.
Mel
Ah - jetzt verstehe ich, [cmd] folgt nicht [expression], aber es ist eine Beschreibung der vorherigen Zeile.
Benutzer unbekannt
2
OP behauptet, dass find"Parameter auf schmerzhafte Weise anders erwartet werden als bei den meisten anderen Utils". Sie geben an, dass OP "Ausdrucksprimäre mit Optionen verwechselt". Haben die meisten anderen Tools überhaupt ein Konzept von "Ausdrucksprimären"? Falls nicht, dass nicht zeigen Punkt des OP? Und das ist wirklich nicht der seltsamste Teil des Gebrauchs find. Welche andere CLI ist involviert {}(welche muss natürlich irgendwie ausgeblendet werden)?
Kyle Strand
10

Dies hängt von der genauen Funktionalität ab, auf finddie Sie sich verlassen. Wenn es sich (hauptsächlich) um die Suchfunktion handelt, unterstützen einige Shells rekursive Globs. ZB mit 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 hat durch Glob Qualifiers viel mehr findige Möglichkeiten (siehe Ende man zshexpn). Beispielsweise:

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

Bash 4 hat auch **/(Sie müssen es aktivieren shopt -s globstar), aber nichts wie Glob-Qualifikatoren.

jmtd
quelle
10

Ich würde einen Blick darauf werfen locate. Es durchsucht seine Datenbank mit Dateien und druckt schnell die Pfadnamen aus, die Ihren Angaben entsprechen.

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:~$ 

Wie Sie sehen, handelt es sich um eine Untertextübereinstimmung : Wenn Sie eine Untertextübereinstimmung angeben, stimmtodg die Übereinstimmung mit der Untertextübereinstimmung überein . Aber wenn Sie es geben .odg, dann wird es nicht.

Es gibt jedoch einen Nachteil: Es braucht eine Datenbank. Diese Datenbank muss aktualisiert werden, wenn sich etwas ändert. Bei meiner Fedora 13-Installation ist dies jedoch in einer täglichen Crontab enthalten.

Kevin M
quelle
Ich liebelocate
Andrew Lambert
1
Außerdem akzeptiert locate auch Muster (das habe ich erst kürzlich gelernt).
Adam Byrtek
5

Was versuchst du zu finden? Wenn Sie normalerweise nach Quellcodedateien suchen, schauen Sie sich an ack. Es ist im Grunde ein Quellcode-Suchwerkzeug, aber der -fSchalter von ack findet Dateien, die einem bestimmten Dateityp entsprechen.

Wenn Sie also beispielsweise alle Perl-Dateien in einem Verzeichnis suchen möchten, gehen Sie wie folgt vor:

ack -f --perl

Wenn Ihnen die von ack erkannten Dateitypen nicht gefallen, können Sie Ihre eigenen hinzufügen ~/.ackrc.

ack ist kein universeller Dateisucher find, aber wenn Sie mit Quellcode arbeiten, kann es sehr praktisch sein.

Andy Lester
quelle
1
Dies ist nicht das, was der Benutzer gefragt hat, aber die Leute finden es möglicherweise sehr nützlich, es im Quellcode zu finden (wie grep). The Silver Searcher , silversearcher-agPaket auf Hauptdistros.
Pablo A
-1

Eines der großartigen Dinge, die jeder Programmierer lernen sollte, ist: Wenn Sie kein Werkzeug finden können, bauen Sie Ihr eigenes!

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

Ich könnte ein besseres schreiben, mit -tFiltern von Typen usw.

Bearbeiten : Das obige ist ein Bash-Skript. Es verwendet das Befehlszeilenargument und übergibt es an den Wert der Option -name. Nur ein einfaches Beispiel. Seit ich diese Antwort geschrieben habe, habe ich folgendes Python-Skript gefunden:

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

Das Interface sieht gut aus, aber ich habe seine Leistung nicht getestet. Könnte es wert sein, ausgecheckt zu werden.

xixixao
quelle
1
True für das Erstellen einer eigenen Tool-Anweisung. Aber erkläre wenigstens, wie dein kleines Drehbuch funktionieren soll.
jippie
1
$<macht in meinem Bash nichts Sinnvolles. Was erwartest du davon? Meinen Sie "$@"eigentlich? Oder "$1"(was bedeutet das eigentlich in einem Makefile)?
Tripleee
1
@tripleee - $<ist das cshÄquivalent von read- Ich vermute , er damit meinte.
DarkHeart
-2

Die Standardmethode, um Dinge in Unix zu finden.

du -a <directory>|grep <pattern>| awk  '{print $2}'
Johny Smith
quelle
1
grep | awkist ein Antimuster. Siehe nutzlose Verwendung vongrep . Wenn Sie das Muster parametrisieren möchten,du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
Tripleee
@tripleee Das ist eine sehr hilfreiche Information awk, aber einer der großen Vorteile der UNIX-Philosophie ist, dass man nicht alle Funktionen der komplexeren Tools (wie awkund find) verstehen muss, um Pipelines zu erstellen, die die gewünschten Ergebnisse erzielen Aufgabe. grep | awkMöglicherweise nicht optimal (oder auf einem performanten Multithread-System mit einem hochoptimierten System grepmöglicherweise!), aber es ist einfach .
Kyle Strand