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 expected
si hay varios*.ENDING
archivos 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 retornoFalse
para 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
*.ENDING
cuando 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 expected
el 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 -u
Editar : Vaya, tampoco funcionará.
fuente
q
en egrep es para tranquilidadCon
egrep
usted puede intercambiar la expresión regular que necesitals -1 "{}"
genera los nombres de archivo del comando findfuente