há vários problemas no seu script, começando com:
folder1="path-to-folder"
cd $folder1
while file=$(ls "$folder1") ...
isso realmente faz cd path-to-folder; ls path-to-folder ; se path-to-folder for absoluto (começando com um '/' como no seu exemplo), isso pode funcionar, mas não funcionará sempre que você usar caminhos relativos.
Ele também não funcionará se path-to-folder contiver espaços, como você deve usar aspas em todos os lugares, por exemplo, cd "$folder1"
em seguida, fazer um while file=$(ls ...) fará um loop infinito, pois file sempre será definido como algo (o conteúdo do diretório).
a sintaxe apropriada seria for file in $(ls ...) , que parará de funcionar assim que você tiver nomes de arquivos com espaços (como o loop será executado em foo e bar se você tiver um arquivo chamado foo bar ). verifique por que você deve nunca analisar a saída de ls . em vez de usar ls você poderia simplesmente fazer for file in * .
finalmente, você pode ter arquivos que estão mudando, mesmo que o tamanho não esteja mais mudando.
uma boa maneira de iterar os arquivos é o comando find ; uma boa maneira de verificar se algo mudou é o mtime de um arquivo.
a seguinte função fornece um valor para a última modificação (mtime) de qualquer arquivo no diretório especificado
folder1="/path-to-folder"
find "${folder1}" -exec stat -c "%Y" \{\} \; \
| sort -n | tail -1
para que seu script se pareça com:
#!/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..."
UPDATE
uma abordagem ainda melhor seria notificar ativamente o receptor de que um determinado arquivo foi transmitido.
Uma solução muito simples seria também copiar um arquivo fictício vazio após a transmissão da carga útil. por exemplo. para um arquivo chamado foo.avi , copie outro arquivo foo.avi.copyfinished ; então você só precisa verificar a existência de foo.avi.copyfinished para ver que foo.avi está pronto.
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 solução obviamente requer a cooperação do lado do envio.