我正在尝试创建一个脚本来处理目录中的修改/新文件(由lftp
从远程目录镜像,但这是另一个故事。)
要跟踪修改过的文件,请使用fswatch
。然后,我将fswatch
检测到的文件从xml转换为json,并将它们存储在一个单独的目录中。一旦没有更多文件要处理(镜像作业结束时),我确保可以停止此转换。我会跟踪完成后镜像过程将创建的文件。
我的脚本有效,但由于一个奇怪的原因,在镜像作业完成之前我没有看到json文件。就好像转换后的文件存储在内存中的某个位置,只要“停止”条件为真,那些文件就会神奇地出现在目录中。
这是正常行为吗?如何在处理文件后立即显示文件?我可以通过哪些方式优化我想要实现的目标? (我是bash的新手......以及一般的编程。)
这是我使用的脚本:
my_convert_xml_to_json_function () {
if [ -f "$1" ]; then
temporary_file_name_for_json=$(echo "${1/$path_to_xml_files\/}" | base64)
xml2json < "$1" | jq -rc '.amf' > "${path_to_json_files}/${temporary_file_name_for_json}.txt"
fi
}
export -f my_convert_xml_to_json_function
export path_to_xml_files
export path_to_json_files
# repeat watching for files until the mirroring is over
fswatch -0 --event Updated --event Created "${path_to_xml_files}" | grep -ai 'xml$' | xargs -0 -n 1 -I {} bash -c 'my_convert_xml_to_json_function "{}"' &
temporary_pid_of_fswatch=`jobs -p`
echo "This is PID of the last bit in the pipeline: $!; this is PID of the fswatch: ${temporary_pid_of_fswatch}"
# now check for the existence of a stopping rule
while [[ $(shopt -s nullglob; set -- "${my_temporary_files}"/xml-mirrorring-started-on-*-is-completed.txt; echo $#) -eq 0 ]]; do
# tell the script to stop and remove the file generated by the mirror into the trashcan
sleep 1 && temp_continue_check="running `date`"
echo "Stop condition met (${temp_continue_check})."
done && kill -15 "${temporary_pid_of_fswatch}" && mv -v "${my_temporary_files}"/xml-mirrorring-started-on-*-is-completed.txt "$my_trashcan"
编辑:所以在@snorp的评论之后,如果我将sync
添加到脚本中,那么我就能够“实时”更新文件。否则,文件就在空中...如果进程在后台运行并且我输入sync
我会得到一个似乎“冻结”的新进程(基于top
输出我可以看到它正在做某事,但我没有看到处理过的文件写入文件夹就像它们应该(最终)那样。有没有办法强迫OSX将这些文件实际写入磁盘(不包括脚本中的同步)?