![DD Bash 备份问题 - “无法识别的操作数”](https://linux22.com/image/1466840/DD%20Bash%20%E5%A4%87%E4%BB%BD%E9%97%AE%E9%A2%98%20-%20%E2%80%9C%E6%97%A0%E6%B3%95%E8%AF%86%E5%88%AB%E7%9A%84%E6%93%8D%E4%BD%9C%E6%95%B0%E2%80%9D.png)
我正在使用Datto 块驱动程序每晚拍摄我正在运行的服务器的快照。拍摄快照后,我通过 PipeViewer ( )dd
将快照复制到文件系统上的文件中。然后,将该文件上传到 DropBox 并删除。/dev/datto0
pv
gzip
我已经使用 Bash 脚本自动执行此操作,并将其设置为每晚通过 cron 作业运行。以下是给我带来麻烦的 Bash 脚本片段:
echo "$(date +"%r"): Calculating MD5 checksum of /dev/datto0..."
MD5=$(md5sum /dev/datto0)
echo "$(date +"%r"): MD5: $MD5"
echo "$(date +"%r"): Compressing /dev/datto0 via gzip to /tmp directory..."
dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz
echo "$(date +"%r"): Compression complete. File size is: $(du -b /tmp/BACKUP_${TODAY}_${MD5}.dd.gz | cut -f1) bytes"
这是引发的错误:
02:37:35 PM: Calculating MD5 checksum of /dev/datto0...
02:54:01 PM: MD5: 28a6a6c11f088d6149d178af6e45102a /dev/datto0
02:54:01 PM: Compressing /dev/datto0 via gzip to /tmp directory...
dd: unrecognized operand ‘/dev/datto0.dd.gz’
Try 'dd --help' for more information.
896kB 0:00:00 [42.7MB/s] [ <=> ]
du: cannot access ‘/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a’: No such file or directory
du: cannot access ‘/dev/datto0.dd.gz’: No such file or directory
02:54:01 PM: Compression complete. File size is: bytes
以下是真正让我挠头的错误部分:
dd: unrecognized operand ‘/dev/datto0.dd.gz’
在我的剧本中,我一次也没有提到/dev/datto0.dd.gz
也许我的部分dd
命令由于某种原因被跳过了?dd: unrecognized operand ‘/dev/datto0.dd.gz’
答案1
问题是,输出md5sum
包含哈希值和原始文件名,因此变量 MD5 被设置为类似于的内容28a6a6c11f088d6149d178af6e45102a /dev/datto0
。因此命令
dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz
扩展为
dd of=/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a /dev/datto0.dd.gz
...这让人dd
很困惑。同样,当您使用 时> /tmp/BACKUP_${TODAY}_${MD5}.dd.gz
,它会扩展为两个单词,shell 不确定将输出发送到哪个单词,并且会给出“模糊重定向”错误。
您可以md5sum
通过管道输出来解决这个问题awk '{print $1}'
:
MD5=$(md5sum /dev/datto0 | awk '{print $1}')
...或者使用变量扩展${MD5%% *}
,它将修剪第一个空格及其后的所有内容。此外,通常将变量引用放在双引号内是个好主意——它可以避免很多像这样的奇怪解析问题。结合使用Giacomo1968 的回答给出:
dd if=/dev/datto0 | pv | gzip -1 > "/tmp/BACKUP_${TODAY}_${MD5%% *}.dd.gz"
答案2
此dd
命令看起来很奇怪。为什么dd if
管道一侧有一个,而dd of
另一侧有一个?
dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz
基于本页给出的建议用于dd
备份目的时,您的命令似乎应该是这样的:
dd if=/dev/datto0 | pv | gzip -1 > /tmp/BACKUP_${TODAY}_${MD5}.dd.gz
请注意,最后| dd of=
只是通过右箭头 ( >
) 进行简单的输出重定向。