GNU/Linux >> Tutoriales Linux >  >> Linux

¿Esperar a que terminen de descargarse varios archivos?

Tengo el siguiente script que verifica si hay un archivo en una carpeta y si el archivo es estable (esto es para un archivo de video grande que estoy recibiendo).

#!/bin/bash

cdate1=$(date +%Y%m%d-%T)
folder1="/path-to-folder"

cd $folder1

while file=$(ls "$folder1")
      [ -z "$file" ]
        do sleep 10
        done
            echo "There is a file in the folder at $cdate1"
            size1=$(stat -c '%s' "$file")
            echo "The size1 is $size1"
            sleep 30
            size2=$(stat -c '%s' "$file")
            echo "The size2 is $size2"
        if [ $size1 = $size2 ]
        then
            ls -l
            echo "Start converting"
        else 
            echo "Restart the script"
        fi

¿Cómo modificar la secuencia de comandos para que pueda verificar varios archivos en la misma carpeta y después de que todos estén estables para iniciar la secuencia de comandos de conversión?

Respuesta aceptada:

hay una serie de problemas en su secuencia de comandos, comenzando con:

folder1="path-to-folder"
cd $folder1
while file=$(ls "$folder1") ...

esto realmente hace cd path-to-folder; ls path-to-folder; if path-to-folder es absoluto (comenzando con '/' como en su ejemplo) esto podría funcionar, pero no funcionará siempre que use rutas relativas.
tampoco funcionará si path-to-folder contiene espacios, ya que debe usar comillas en todas partes, p. cd "$folder1"

luego haciendo un while file=$(ls ...) hará un bucle infinito, como file siempre se establecerá en algo (el contenido del directorio).

la sintaxis adecuada sería for file in $(ls ...) , que dejará de funcionar tan pronto como tenga nombres de archivo con espacios (ya que el bucle se ejecutará en foo y bar si tiene un archivo llamado foo bar ). compruebe por qué nunca debe analizar la salida de ls. en lugar de usar ls simplemente podrías hacer for file in * .

finalmente, podría tener archivos que están cambiando incluso si su tamaño ya no cambia.

una buena forma de iterar sobre los archivos es find dominio; una buena forma de comprobar si algo ha cambiado es el mtime de un archivo.

la siguiente función le da un valor para la última modificación (mtime) de cualquier archivo en el directorio dado

folder1="/path-to-folder"
find "${folder1}" -exec stat -c "%Y" \{\} \;    \
   | sort -n | tail -1

para que su secuencia de comandos se vea así:

#!/bin/bash
dir="$1"
# check whether $dir exists
test -d "${dir}" || exit 1

last=0
current=1

while [ "$last" != "$current" ]; do
   last=$current
   current=$(find "${dir}" -exec stat -c "%Y" \{\} \; \
             | sort -n | tail -1)
   sleep 10
done
echo "directory is now stable..."

ACTUALIZAR

un enfoque aún mejor sería notificar activamente al receptor que se ha transmitido un archivo determinado.
una solución muy simple sería copiar también un archivo ficticio vacío después de que se haya transmitido la carga útil. p.ej. para un archivo llamado foo.avi copia otro archivo foo.avi.copyfinished; por lo que solo necesita verificar la existencia de foo.avi.copyfinished para ver que foo.avi está listo.

while true; do
 for file_ready in *.copyfinished; do
   file=${file_ready%.copyfinished}
   if [ -e "${file}.converted" ]; then
      echo "skipping already converted file ${file}" 1>&2
   else
      touch "${file}.converted"
      do_convert "${file}"
   fi
 done
 sleep 1
done

esta solución obviamente requiere la cooperación del lado emisor.

Relacionado:arduino:¿programación de múltiples circuitos integrados usando un solo bus USBasp/SPI y Arduino IDE?
Linux
  1. ¿Script de Shell para mover archivos más antiguos?

  2. KRename:un potente renombrador de archivos por lotes para Linux

  3. Linux:elimine las extensiones de archivo para varios archivos

  4. Necesita un buen editor hexadecimal para Linux

  5. Eliminar parte de un nombre de archivo para varios archivos en Linux

Comando ls en Linux para listar archivos

Descargar un archivo con wget usando múltiples conexiones

¿Cuál es una buena solución para el etiquetado de archivos en Linux?

Une varios archivos MP3 (sin pérdidas)

¿Diferencia binaria/parche para archivos grandes en Linux?

herramienta para dividir archivos pcap por conexión TCP?