“dd”操作后的清理

“dd”操作后的清理

我正在使用带有“excl”选项的 dd。如果用 CTRL+C 中断,“dd”会保留它已创建但未完成写入的文件。在这种情况下,我需要使用陷阱 INT 来清理它。但是,我不知道在这种情况下如何测试该文件是否之前已经存在或由 dd 创建。换句话说,“excl”是否已启动从 dd 退出或其他操作。退出状态可能无法在陷阱内部告诉它,因为其他命令可以返回相同的代码。将 if [ -e file ] 放在 dd 之前可以工作,但不是原子的。该文件可以由中间的其他应用程序创建。只需要一些优雅的解决方案。

答案1

bash 和文件重定向:

清理(​​) {
    执行 {fd}>&-
    rm -f "$输出"
}

设置-e
设置-o noclobber
# 使用 noclobber,如果输出文件存在,重定向将失败
exec {fd}>"$out" || 退出 3
陷阱“清理;退出 4”INT TERM ERR EXIT
# 写入已打开的文件
dd if=/dev/zero of=/dev/fd/$fd bs=256k count=$(( size*4 ))
# /dev/fd/$fd 的替代方案是使用 >&$fd 进行重定向
执行 {fd}>&-

临时文件:

清理(​​) {
    rm-f“$temp”
}

设置-e
temp=$(mktemp "${out}_XXXXXX") || 退出 3
陷阱“清理;退出 4”INT TERM ERR EXIT
dd if=/dev/zero of="$temp" bs=256k count=$(( size*4 ))
mv-n“$temp”“$out”

相关内容