Respuestas:
Aquí hay una frase que creo que hace lo que quieres:
find /tmp -name something | egrep '.*'
El estado de retorno será 0
cuando se encuentre algo y, de lo contrario, no será cero.
Si también necesita capturar la salida de find
para un procesamiento posterior, la respuesta de Sven lo ha cubierto.
find ... | read
La solución más simple que no imprime, pero sale 0 cuando se encuentran resultados
find /tmp -name something | grep -q "."
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:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
no parece depender de los códigos de salida de ninguno de los -exec
s que ejecutó.
exec
sección, no bajo el valor de retorno). No puede diferenciar entre nada encontrado y encontrarse con errores (por ejemplo, cuando se invocó en un punto de partida inexistente).
Después de encontrar esta pregunta mientras trataba de encontrar la manera de resolver un problema con Puppet (cambiar los permisos en las carpetas de un directorio pero no en el directorio en sí), esto parece funcionar:
! test -z $(find /tmp -name something)
Mi caso de uso específico es este:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Que saldrá del código 1 si el comando find no encuentra archivos con los permisos requeridos.
No es posible. Find devuelve 0 si sale con éxito, incluso si no encontró un archivo (que es un resultado correcto que no indica un error cuando el archivo no existe).
Para citar la página de búsqueda
ESTADO DE SALIDA
buscar salidas con estado 0 si todos los archivos se procesan correctamente, mayor que 0 si se producen errores. Esta es deliberadamente una descripción muy amplia, pero si el valor de retorno no es cero, no debe confiar en la exactitud de los resultados de find.
Dependiendo de lo que desee lograr, podría intentar dejar encontrar -print
el nombre de archivo y probarlo con su salida:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
(usado con +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Siento que este es el método más conciso y directo:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
, lo que podría abordar su preocupación.
Aquí hay un pequeño guión que llamé test.py
. Mejora con respecto a otros métodos publicados, ya que devolverá un código de error si se establece uno, y además establece uno si find no enumera ningún archivo:
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
Aquí está la salida de la línea de comandos:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Luego, para un resultado donde find tenía errores pero encontró archivos:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
Luego, si desea la lista de archivos, puede hacer uso de -print 0
pasar find
y dividir la variable en nulos, o simplemente puede agregarle una declaración de impresión.
No es solo find
que devuelve los códigos de estado de salida como cero cuando tiene éxito. En unix, cualquiera que sea el comando que ejecute, si tiene éxito, devuelve el estado de salida como cero.
*
de laegrep
expresión regular es completamente redundante. Puesto que no se está utilizandoegrep
la sintaxis de expresiones regulares, el viejo y simplegrep
puede haber algunos microsegundos más rápido.