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.