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?