Estoy intentando crear un script que muestre archivos en el directorio más nuevos que uno dado como argumento, pero parece que tengo un problema. Actualmente tengo:
for f in *; do
if [["$f" -nt "$1"]]; then
echo "$f"
fi
done
Sin embargo, esto me sigue dando el error de que no se pueden encontrar comandos en referencia a los archivos que se están iterando. ¿Cómo puedo solucionar los problemas con este script?
Respuesta1
Necesitas espacios alrededor del [[
y]]
for f in *; do
if [[ "$f" -nt "$1" ]]; then
echo "$f"
fi
done
Sin los espacios, obtendrá una serie de errores de "comando no encontrado". Esto se debe a que el shell busca un comando con el nombre de [["$f"
y no puede encontrarlo. El comando que desea ejecutar es [[
.
Alternativa
Sin necesidad de hacer bucles:
find . -maxdepth 1 -newer "$1"
Respuesta2
Necesitas un espacio después del [[
y otro antes del ]]
. Este es un remanente de [
, que tradicionalmente es un archivo ejecutable real ( /bin/[
, vinculado simbólicamente a /bin/test
): necesitaba un espacio para forzar que se evaluara [
con expression
argumentos en lugar de [expression
.
Si bien [[
es una palabra clave bash, tiene un requisito similar.
En general, también se recomienda utilizar compatibilidad con POSIX [
en sus scripts siempre que sea posible. [[
no es estándar y por lo tanto no funcionará en todos los shells POSIX.