Estoy tratando de usar la siguiente condición para detectar archivos *.tgz en un directorio:
if [ -e ${INPUT_DIRECTORY}*tgz ]
Si bien esta condición funciona muy bien cuando solo hay un archivo, me da un error de expected binary operator en la línea 'si' de mi secuencia de comandos, cuando hay más de un archivo *.tgz en el directorio.
Qué me estoy perdiendo ?
Puede simplemente ls , luego verifique el código de salida de ls. Si es 0 entonces el archivo existe, de lo contrario no existe.
$ ls wfh.sh wfh.sh $ echo $? 0 $ ls a ls: cannot access 'a': No such file or directory $ echo $? 2En tu caso, puedes escribir:
ls ${INPUT_DIRECTORY}*.tgz > /dev/null 2>&1 if [ $? -eq 0 ] ; then echo "exist!" else echo "not!" fi Además, debe cambiar su globbing a ${INPUT_DIRECTORY}*.tgz en lugar de ${INPUT_DIRECTORY}*tgz ya que puede coincidir involuntariamente con algo como filletgz
Para un script más legible, también puede escribir:
if ls ${INPUT_DIRECTORY}*.tgz > /dev/null 2>&1 ; then echo "exist!" else echo "not!" fiAquí hay una sugerencia para una prueba, en shell puro:
for i in "$input_dir"/*.tgz "$input_dir"/.*.tgz; do test -e "$i" && break done Esto devuelve éxito o fracaso, dependiendo de si existen archivos .tgz . Obviamente, puede eliminar el segundo patrón si desea ignorar los archivos ocultos.
Como función/ejemplo:
suffix_exists () { for i in "${2:-.}"/*"$1" "${2:-.}"/.*"$1"; do test -e "$i" && return 0 done } if suffix_exists .tgz "$input_dir"; then echo "$input_dir contains .tgz archives" else echo "$input_dir does not contain .tgz archives" fiUtiliza el directorio actual si no se proporciona ninguno.
Como se mencionó en otra respuesta, es posible que esté abordando su tarea de manera incorrecta (tal vez publique su objetivo). En lugar de detectar archivos .tgz en el directorio, puede ejecutar un comando en cualquier archivo que exista, usando find . Por ejemplo extrayéndolos:
find "$input_dir" -mindepth 1 -maxdepth 1 \ -type f -name '*.tgz' -exec tar xf {} \;O moverlos a algún lugar:
find "$input_dir" -mindepth 1 -maxdepth 1 \ -type f -name '*.tgz' -exec mv -i {} /my/archives \;