Czy istnieje alternatywny find
program z bardziej konwencjonalnym interfejsem CLI? find
dział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).
command-line
software-rec
find
utilities
Tamás Szelei
źródło
źródło
ack
i zastanawiałem się, czy jest też coś lepszegofind
.Odpowiedzi:
Jest to powszechne nieporozumienie.
Znajdź działa zgodnie ze składnią opcji. Po prostu mylicie podstawowe wyrażenia z opcjami:
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.
źródło
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żywaniafind
. Z czym wiąże się inne CLI{}
(które oczywiście należy jakoś uniknąć)?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. Zzsh
: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.źródło
Rzuciłbym okiem
locate
. Przejrzy bazę danych plików i szybko wydrukuje nazwy ścieżek pasujące do podanych przez Ciebie danych.Jak widać, jest
odg
to 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.
źródło
locate
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-f
przełącznik ack znajdzie pliki pasujące do danego typu pliku.Więc jeśli chcesz znaleźć wszystkie pliki Perla w katalogu, na przykład:
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.źródło
silversearcher-ag
pakiet na głównych dystrybucjach.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!
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ć.
źródło
$<
nie robi nic użytecznego w mojej Bash. Czego się spodziewasz? Masz na myśli"$@"
? Lub"$1"
(co w zasadzie oznacza to w Makefile)?$<
tocsh
odpowiednikread
- zgaduję, że miał to na myśli.Najbardziej standardowy sposób znajdowania rzeczy w unixie.
źródło
grep | awk
jest antypatternem. Zobacz bezużyteczne użyciegrep
. Jeśli chcesz sparametryzować wzór, być możedu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
awk
, ale jedną z wielkich zalet filozofii UNIX jest to, że nie trzeba rozumieć wszystkich funkcji bardziej złożonych narzędzi (takich jakawk
ifind
), aby konstruować potoki, które mogą wykonywać pożądane zadanie.grep | awk
może nie być optymalny (lub, na wydajnym systemie wielowątkowym z wysoce zoptymalizowanymgrep
, być może, będzie!), ale jest prosty .