Quiero mostrar todos los directorios que no contienen archivos con un final de archivo específico. Por lo tanto, intenté usar el siguiente código:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
En este ejemplo, quería mostrar todos los directorios que no contienen archivos con el final .ENDING, pero esto no funciona.
¿Dónde está mi error?

Respuestas:
Aquí hay una solución en tres pasos:
fuente
comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)¡Aquí vamos!
O alternativamente (y más pitónico):
¡Contenido extra de contenido descargable!
La versión (en su mayoría) corregida del comando find:
fuente
test: ...: binary operator expectedsi hay varios*.ENDINGarchivos en un directorio.next(filter(lambda x: x.endswith('.ENDING'), filenames))también podría escribirse usando la comprensión del generador, es decirnext(x for x in filenames if x.endswith('.ENDING')).if not any(x.endswith('.ENDING') for x in filenames)base al hecho de que cualquier retornoFalsepara un iterable vacío.El shell expande el
*, pero en su caso no hay shell involucrado, solo el comando de prueba ejecutado por find . Por lo tanto, el archivo cuya existencia se prueba se llama literalmente*.ENDING.En su lugar, debería usar algo como esto:
Esto daría como resultado que sh se expanda
*.ENDINGcuando se ejecute la prueba .Fuente: encuentra globbing en UX.SE
fuente
-c: line 0: syntax error near unexpected token(''. Mis nombres de directorio tienen el formato 'xyz (dfdf)'. De hecho, es una biblioteca de calibre.sh: line 0: test: foo1/bar.ENDING: binary operator expectedel directorio que contiene un archivo con el finalENDING.sh: -c: line 0: syntax error near unexpected token('sh: -c: línea 0:' prueba -e prueba (prueba) / *. Terminando '. / test (test) ". Pero cuando cambio .ending a .xyz obtengo el mismo resultado. Esto se debe a que tengo brácteas como nombre de directorio, ¿verdad? ¿Cómo puedo solucionarlo?Inspirado por las respuestas de Dennis Nolte y MikeyB , se me ocurrió esta solución:
Funciona basado en el hecho de que
Por cierto, por eso se redirigió a stderr
/dev/null.fuente
Lo haría personalmente en Perl
Debería hacer el truco (funciona en mi caso de prueba muy simplista).
fuente
Aquí hay un hallazgo de una sola línea.
find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -uEditar : Vaya, tampoco funcionará.
fuente
qen egrep es para tranquilidadCon
egrepusted puede intercambiar la expresión regular que necesitals -1 "{}"genera los nombres de archivo del comando findfuente