Respuestas:
Aquí hay una frase que creo que hace lo que quieres:
find /tmp -name something | egrep '.*'
El estado de retorno será 0cuando se encuentre algo y, de lo contrario, no será cero.
Si también necesita capturar la salida de findpara 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
findno parece depender de los códigos de salida de ninguno de los -execs que ejecutó.
execsecció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 -printel 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 0pasar findy dividir la variable en nulos, o simplemente puede agregarle una declaración de impresión.
No es solo findque 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 laegrepexpresión regular es completamente redundante. Puesto que no se está utilizandoegrepla sintaxis de expresiones regulares, el viejo y simplegreppuede haber algunos microsegundos más rápido.