Alternatywa do znalezienia? [Zamknięte]

30

Czy istnieje alternatywny findprogram z bardziej konwencjonalnym interfejsem CLI? finddziała i oczekuje parametrów w boleśnie inny sposób niż większość innych narzędzi.

Wyjaśnienie: Szukam programu, który ma w większości taką samą funkcjonalność jak find z interfejsem wiersza poleceń, który działa i wydaje się być zaleceniami wiersza polecenia POSIX (lub przynajmniej GNU).

Tamás Szelei
źródło
7
GNU find nie przestrzega wytycznych POSIX (a nawet GNU) dla wiersza poleceń. Na przykład kolejność parametrów, opcje wieloznakowe z jednym myślnikiem itp. Są inne niż w programach zgodnych.
Tamás Szelei
3
Wiem i zawsze mogę robić to, co zamierzam, w ten czy inny sposób. Niedawno się dowiedziałem acki zastanawiałem się, czy jest też coś lepszego find.
Tamás Szelei
2
Nie. Widzisz, nie chcę małego języka programowania, ale prostszego, bardziej intuicyjnego i bardziej spójnego wyszukiwania (nawet jeśli oznacza to utratę niektórych zaawansowanych funkcji). Kiedy staję przed zadaniem, które uzasadnia napisanie programu, robię to.
Tamás Szelei
2
find jest zarówno spójny (patrz moja odpowiedź), jak i intuicyjny. To nie tak, że nazwy podstawowe są dziwne. -exec oznacza wykonanie, -print oznacza wydrukowanie go, -name oznacza dopasowanie nazwy. W praktyce poprzednie 3 i typ obejmują 95% przypadków użycia. We wszystkich innych przypadkach człowiek znajduje.
Mel
3
@tamas Zedytowałem godzinę temu i powiedziałem, że nie ma alternatywy poza lokalizacją. I może ls-R o tym pomyśli. Inne alternatywy to programy GUI, które emulują find. W przeciwnym razie musisz określić, co chcesz znaleźć dla swojej alternatywy. Spacerować po drzewach? Filtrować nazwy plików? Powiedz ci, które pliki są nowsze?
Mel

Odpowiedzi:

11

Jest to powszechne nieporozumienie.

Znajdź działa zgodnie ze składnią opcji. Po prostu mylicie podstawowe wyrażenia z opcjami:

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

Alternatywą jest zlokalizowanie. Ale find implementuje własną składnię wyrażeń, ponieważ zapewnia bogatszy zestaw opcji filtrów i akcji. Nie ma alternatywy, która mogłaby zrobić to samo, po prostu dlatego, że byłaby zbędna.

Mel
źródło
5
Nawet jeśli to moja wina, to nie odpowiada na moje pytanie.
Tamás Szelei
Jaka jest różnica między wyrażeniem (tylko jedno dozwolone?), Cmd (dito?), Opcjami i argumentami?
użytkownik nieznany
@ użytkownik nieznany - polecenie find implementuje własną składnię wyrażeń. Podane wyrażenie jest ostatnim argumentem w linii poleceń. W przypadku nieobecności wyrażenie zamienia się na -print.
Mel
Ach - teraz widzę, że [cmd] nie podąża za [wyrażeniem], ale jest to opis linii wcześniej.
użytkownik nieznany
2
OP zapewnia, że find„oczekuje parametrów w boleśnie inny sposób niż większość innych narzędzi”. Stwierdzasz, że OP to „mylące wyrażenia podstawowe z opcjami”. Czy większość innych narzędzi ma nawet pojęcie „podstawowych wyrażeń”? Jeśli nie, czy nie świadczy to o znaczeniu OP? I to naprawdę nie jest najdziwniejsza część używania find. Z czym wiąże się inne CLI {}(które oczywiście należy jakoś uniknąć)?
Kyle Strand
10

To zależy od dokładnej funkcjonalności find, na której polegasz. Jeśli jest to (głównie) funkcja wyszukiwania, niektóre powłoki obsługują rekurencyjne globusy. Np. Z 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 ma o wiele więcej możliwości wyszukiwania dzięki globalnym kwalifikatorom (spójrz pod koniec man zshexpn). Na przykład:

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

Bash 4 ma również **/(musisz to włączyć shopt -s globstar), ale nie ma to jak kwalifikatory glob.

jmtd
źródło
10

Rzuciłbym okiem locate. Przejrzy bazę danych plików i szybko wydrukuje nazwy ścieżek pasujące do podanych przez Ciebie danych.

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

Jak widać, jest odgto dopasowanie podtekstu : jeśli go podasz , to dopasuje d odg e. Ale jeśli dasz to .odg, to nie zrobi tego.

Jest jednak jedna wada: potrzebuje bazy danych. Ta baza danych musi zostać zaktualizowana, gdy coś się zmieni. Jednak moja instalacja Fedory 13 ma to w codziennym crontabie.

Kevin M.
źródło
Uwielbiamlocate
Andrew Lambert
1
Co więcej, locate również akceptuje wzorce (dowiedziałem się tego niedawno).
Adam Byrtek
5

Co próbujesz znaleźć Jeśli zazwyczaj szukasz plików kodu źródłowego, spójrz na ack. Zasadniczo jest to narzędzie do wyszukiwania kodu źródłowego, ale -fprzełącznik ack znajdzie pliki pasujące do danego typu pliku.

Więc jeśli chcesz znaleźć wszystkie pliki Perla w katalogu, na przykład:

ack -f --perl

Jeśli nie podobają Ci się rozpoznawane typy plików, możesz dodać własne w swoim ~/.ackrc.

ack nie jest narzędziem do wyszukiwania plików ogólnego przeznaczenia find, ale jeśli pracujesz z kodem źródłowym, może być bardzo przydatny.

Andy Lester
źródło
1
Nie o to pytał użytkownik, ale ludzie mogą znaleźć bardzo przydatne do znalezienia w kodzie źródłowym (np. Grep) The Silver Searcher , silversearcher-agpakiet na głównych dystrybucjach.
Pablo A
-1

Jedną z wielkich rzeczy, których powinien nauczyć się każdy programista, jest to: jeśli nie możesz znaleźć narzędzia, zbuduj własne!

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

Mógłbym napisać lepszy, z -t filtrami typów itp.

Edytować : Powyżej jest skrypt Bash. Pobiera argument wiersza poleceń i przekazuje go jako wartość opcji -name. Po prostu prosty przykład. Ponieważ postawiłem tę odpowiedź, znalazłem ten skrypt w języku Python:

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

Interfejs wygląda ładnie, ale nie przetestowałem jego wydajności. Może warto to sprawdzić.

xixixao
źródło
1
Prawda dla budowy własnego zestawienia narzędzi. Ale przynajmniej wyjaśnij, jak powinien działać twój mały skrypt.
jippie 16.12.12
1
$<nie robi nic użytecznego w mojej Bash. Czego się spodziewasz? Masz na myśli "$@"? Lub "$1"(co w zasadzie oznacza to w Makefile)?
tripleee
1
@tripleee - $<to cshodpowiednik read- zgaduję, że miał to na myśli.
DarkHeart
-2

Najbardziej standardowy sposób znajdowania rzeczy w unixie.

du -a <directory>|grep <pattern>| awk  '{print $2}'
John Smith
źródło
1
grep | awkjest antypatternem. Zobacz bezużyteczne użyciegrep . Jeśli chcesz sparametryzować wzór, być możedu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee
@tripleee To bardzo pomocne informacje na temat awk, ale jedną z wielkich zalet filozofii UNIX jest to, że nie trzeba rozumieć wszystkich funkcji bardziej złożonych narzędzi (takich jak awki find), aby konstruować potoki, które mogą wykonywać pożądane zadanie. grep | awkmoże nie być optymalny (lub, na wydajnym systemie wielowątkowym z wysoce zoptymalizowanym grep, być może, będzie!), ale jest prosty .
Kyle Strand