¿Hay algún medio idiomático para detectar si "find" encontró alguna coincidencia? Actualmente estoy usando
COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then
pero esto me parece un poco indirecto. Además, me gustaría que dejara de buscar una vez que haya encontrado una coincidencia, para que no pierda tiempo y esfuerzo. Solo necesito saber si hay archivos que coincidan o no.
Actualización: cometí el error de escribir mi pregunta sin el código que tenía delante: lo uso wc -l
en un caso diferente, donde necesito saber el número total de archivos encontrados de todos modos. En el caso donde solo estoy probando si hay coincidencias, estaba usando if [ -z $(find …) ]
.
-n
solo se aplicaba a variables 'definidas' ($ abc, $ xyz, etc.), pero supongo que $ (...) es una variable temporal 'definida' ... +1 ... (y simplemente lea recientemente que usar-n
es arriesgado, a menos que esté seguro de que la variable aún no se ha declarado y está 'sin usar) ... pero una temperatura no tendrá esta posibilidad ... es decir. sin inicializar vs vacío-n
prueba si una cadena está vacía, no tiene nada que ver con las variables. Lo que has leído probablemente decía que usar-n
no prueba si una variable está definida:-n "$foo"
es falsa sifoo
está definida pero está vacía, y muestra un mensaje de error debajoset -u
.[ -n "${foo+1}" ]
prueba de manera confiable sifoo
está configurado, pero tratar variables vacías y no configuradas de manera idéntica suele ser una buena idea[ -n "${foo:+1}" ]
, o simplemente[ -n "$foo" ]
si no le preocupaset -u
.-quit
disponible, pero la tuberíahead -n 1
funciona (como lo hacehead -c 1
, lo que se detiene incluso antes, pero probablemente con un beneficio insignificante). Además, cometí el error de escribir mi pregunta sin el código que tenía delante: lo usowc -l
en un caso diferente, donde necesito saber la cantidad total de archivos encontrados. En el caso donde solo estoy probando si hay coincidencias, estaba usandoif [ -z `find … ` ]
.Puedes usar la
-quit
acción para detenerte después del primer partido. Probablemente desee combinar eso con otra acción (como-print
) o no podrá saber si encontró algo.Por ejemplo,
find ... -print -quit
imprimirá la ruta del primer archivo coincidente y luego saldrá. O bien, puede usar-printf 1 -quit
para imprimir 1 si hay una coincidencia y nada si no la hay.find
El estado de salida refleja si hubo errores durante la búsqueda y no si encontró algo, por lo que debe verificar su salida para ver si hay una coincidencia.fuente
-quit
es una extensión de GNU. No funcionará en sistemas que usan otras implementaciones de find (1), como OS X, los BSD y probablemente la mayoría de los Unices comerciales.La salida 0 es fácil con find, la salida> 0 es más difícil porque eso generalmente solo ocurre con un error. Sin embargo, podemos hacer que suceda:
Tenga en cuenta que esta solución es más eficaz que usar una subshell; ejecutar falso es ciertamente más rápido que ejecutar incluso Dash:
fuente
Puede envolverlo en la condición de shell, por ejemplo:
¿Dónde
...
está su condición de partido, por ejemplo-name *.txt
.Algunos otros ejemplos:
fuente