Alternativa para encontrar? [cerrado]

30

¿Existe un findprograma alternativo con una interfaz CLI más convencional? findfunciona y espera parámetros de una manera dolorosamente diferente de la mayoría de las otras utilidades.

Aclaración: estoy buscando un programa que tenga principalmente la misma funcionalidad que encontrar con una interfaz de línea de comandos que funciona y se siente como las recomendaciones de la línea de comandos POSIX (o al menos GNU).

Tamás Szelei
fuente
77
GNU find no respeta las pautas POSIX (o incluso GNU) para la línea de comandos. Por ejemplo, el orden de los parámetros, las opciones de varios caracteres con un solo guión, etc. son diferentes que en los programas conformes.
Tamás Szelei
3
Lo sé, y siempre puedo hacer lo que pretendo, de una forma u otra. Hace poco llegué a conocer acky me preguntaba si también hay una mejor find.
Tamás Szelei
2
No. Verá, no quiero un lenguaje de programación pequeño, sino un hallazgo más simple, más intuitivo y más consistente (incluso si eso significa la pérdida de alguna funcionalidad avanzada). Cuando enfrento una tarea que justifica escribir un programa, lo hago.
Tamás Szelei
2
find es consistente (ver mi respuesta) e intuitivo. No es que las primarias se llamen raras. -exec significa ejecutar, -print significa imprimirlo, -name significa coincidir con un nombre. En la práctica, los tipos 3 y anteriores cubren el 95% de los casos de uso. Para todos los demás casos, hay hombre encontrar.
Mel
3
@tamas Edité hace una hora y te dije que no hay otra alternativa que localizar. Y tal vez ls -R ahora que lo pienso. Otras alternativas son los programas GUI que emulan find. De lo contrario, debe especificar qué desea que haga su alternativa de búsqueda. ¿Caminar árboles de dir? Filtrar nombres de archivo? ¿Entonces qué archivos es más nuevo?
Mel

Respuestas:

11

Este es un error común.

Buscar sigue la sintaxis de opciones. Solo estás confundiendo expresiones primarias con opciones:

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

La alternativa es localizar. Pero find implementa su propia sintaxis de expresión porque proporciona un conjunto más rico de opciones de filtro y acción. No hay alternativa que pueda hacer lo mismo, simplemente porque sería redundante.

Mel
fuente
55
Incluso si es mi culpa, esto no responde a mi pregunta.
Tamás Szelei
¿Cuál es la diferencia entre expresión (¿solo una permitida?), Cmd (dito?), Opciones y argumentos?
usuario desconocido
@user unknown: el comando find implementa su propia sintaxis de expresión. La expresión, cuando se da, es el último argumento en la línea de comando. Cuando está ausente, la expresión se resuelve en -print.
Mel
Ah, ahora veo, [cmd] no sigue a [expresión], pero es una descripción de la línea anterior.
Usuario desconocido
2
OP afirma que find"espera parámetros de una manera dolorosamente diferente de la mayoría de las otras utilidades". Usted declara que OP es "expresiones primarias confusas con opciones". ¿La mayoría de las otras utilidades incluso tienen un concepto de "expresión primaria"? Si no, ¿eso no demuestra el punto de OP? Y esa no es la parte más extraña del uso find. ¿Qué otra CLI implica {}(que, por supuesto, se debe escapar de alguna manera)?
Kyle Strand
10

Depende de la funcionalidad precisa en la findque confíe. Si es (principalmente) la funcionalidad de búsqueda, algunos shells son compatibles con globos recursivos. Por ejemplo, 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 tiene muchas más posibilidades de encontrar resultados a través de calificadores globales (mira cerca del final de man zshexpn). Por ejemplo:

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

Bash 4 también tiene **/(debe habilitarlo con shopt -s globstar), pero nada como los calificadores globales.

jmtd
fuente
10

Lo echaría un vistazo locate. Examinará su base de datos de archivos e imprimirá rápidamente los nombres de las rutas que coinciden con lo que usted proporciona.

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

Como puede ver, es una odgcoincidencia de subtexto : si la da , entonces coincidirá con d odg e. Pero si lo das .odg, entonces no lo hará.

Sin embargo, hay un inconveniente: necesita una base de datos. Esta base de datos debe actualizarse cuando las cosas cambian. Sin embargo, mi instalación de Fedora 13 tiene esto en un crontab diario.

Kevin M
fuente
Amolocate
Andrew Lambert
1
Además, localizar también acepta patrones (aprendí esto recientemente).
Adam Byrtek
5

¿Qué intentas encontrar? Si normalmente está buscando archivos de código fuente, eche un vistazo ack. Básicamente es una herramienta de búsqueda de código fuente, pero el -finterruptor de ack encontrará archivos que coincidan con un tipo de archivo determinado.

Entonces, si desea encontrar todos los archivos Perl en un directorio, por ejemplo, simplemente:

ack -f --perl

Si no le gustan los tipos de archivo que ack reconoce, puede agregar los suyos propios ~/.ackrc.

ack no es un buscador de archivos de uso general find, pero si está trabajando con código fuente, puede ser muy útil.

Andy Lester
fuente
1
Esto no es lo que el usuario preguntó, pero la gente puede encontrar muy útil para encontrar en el código fuente (como grep) The Silver Searcher , silversearcher-agpaquete en las principales distribuciones.
Pablo A
-1

Una de las mejores cosas que todo programador debería aprender es: si no puede encontrar una herramienta, ¡cree la suya propia!

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

Podría escribir una mejor, -tpara filtrar tipos, etc.

Editar : lo anterior es un script Bash. Toma el argumento de la línea de comando y lo pasa a buscar como el valor de la opción -name. Solo un simple ejemplo. Desde que presenté esta respuesta, encontré este script de Python:

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

La interfaz se ve bien, pero no he probado su rendimiento. Podría valer la pena echarle un vistazo.

xixixao
fuente
1
Verdadero para construir la propia declaración de herramienta. Pero al menos explique cómo se supone que funciona su pequeño script.
jippie
1
$<no está haciendo nada útil en mi Bash. ¿Qué esperas que haga? ¿Quieres decir en "$@"realidad? ¿O "$1"(que es básicamente lo que esto significa en un Makefile)?
tripleee
1
@tripleee - $<es el cshequivalente de read- Supongo que quiso decir eso.
DarkHeart
-2

La forma más estándar de encontrar cosas en unix.

du -a <directory>|grep <pattern>| awk  '{print $2}'
johny smith
fuente
1
grep | awkEs un antipatrón. Ver uso inútil degrep . Si desea parametrizar el patrón, tal vezdu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee
@tripleee Esa es una información muy útil awk, pero una de las grandes ventajas de la filosofía UNIX es que no es necesario comprender todas las características de las herramientas más complejas (como awky find) para construir tuberías que puedan realizar las tareas deseadas. tarea. grep | awkpuede no ser óptimo (o, en un sistema multiproceso con un rendimiento altamente optimizado grep, ¡tal vez lo sería!), pero es simple .
Kyle Strand