No use la sustitución de comandos en la salida defind
. Aquí, todo se puede hacer con find
:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
Con algunas find
implementaciones (incluyendo FreeBSD de find
donde proviene y GNU find
), puede usar en -delete
lugar de -exec rm...
.
La razón por la que obtiene un error es que no hay un comando entre then
y else
algunos shells (comenzando con el shell Bourne de donde proviene esa sintaxis) requieren al menos uno (y un comentario no es un comando). Tenga en cuenta que es completamente arbitrario y no hay ninguna razón por la cual esos shells harían eso. yash
y zsh
no tienen esa limitación ( if false; then else echo x; fi
e incluso if false; then else fi
funcionan bien con ellos).
Como otros han dicho, puede usar un comando noop como :
(o for nothing in; do nothing; done
) o revertir la lógica con la !
palabra clave (disponible en shells POSIX, pero no en el shell Bourne (encontrará que usar :
eso era común en ese shell)). mksh
y yash
soporte if false; then () else echo x; fi
(no confiaría en ello, ya que eso podría cambiar en futuras versiones).
Otro enfoque es con:
lsof... || {
cmd1
cmd2
}
aunque una diferencia es el estado general de salida, que será el de lsof
si lsof
falla.
-exec
menudo es útil, como esxargs
, a veces se necesita un bucle de shell. En cuyo caso, unwhile read name
bucle es la opción preferida (en bash con GNU find, puede usar la opción -0 para ambos; de manera portátil, debe renunciar a la nueva línea).-print0
es-exec printf '%s\0' {} +
(pero de forma portátil no puede manejar esa salida, excepto si desea considerarlaperl
), y con unfind .//.
poco de procesamiento posterior, puede escapar de las nuevas líneasxargs
. Tenga en cuenta que no es unwhile read
, eswhile IFS= read -r
.Parece que desea hacer un no-op si el archivo está abierto, por lo que debe agregar un
:
comando nulo enbash
:Si no lo usa
:
,bash
no puede analizar su código y mostrará un error comobash: syntax error near unexpected token 'else'
.fuente
:
y es el primer comando listado en bash-builtins.Otra alternativa: revierte tu lógica.
fuente
TL; DR
Ninguna de las otras respuestas realmente aborda su pregunta original de por qué el comando da un error de sintaxis. Esto es causado por un comando faltante entre entonces y más .
Un comando perdido
Su código original se ve así:
El problema es que tiene un comentario entre entonces y más , pero el comentario no se trata como un comando. En resumen, podría volver a escribir el problema que tiene (estructuralmente hablando) de la siguiente manera:
Arregle su sintaxis con un Bourne Builtin
Puede solucionar este problema colocando comandos reales antes que otra cosa , pero un comentario por sí solo no servirá. La sección if-then no puede estar vacía; si quieres un marcador de posición, puedes usar el colon incorporado . Por ejemplo:
Simplemente colocando
:
en la sección entre entonces y de lo contrario se solucionará el error de sintaxis que está experimentando.fuente
$ ; -bash: syntax error near unexpected token ';'