我有一个shell脚本,我将手机文件夹中的复制过程自动化到Mac上的本地文件夹,然后删除手机上的原件。以前我写过
cd /Users/foo/Phone\ Backups/Phone\ One/Pictures
echo "Meta info of the picture files in the local folder before backup" >> /Users/foo/Documents/preBackup.txt
find . -exec stat -c " %n size %s bytes; LMT %y; CT %w; LAT %x; LSC %z; %F; Owned by: %U" {} \; | tee -a /Users/foo/Documents/preBackup.txt
cp -a /Volumes/Foo\'s\ Phone\ One\ Pictures/. /Users/foo/Phone\ Backups/Phone\ One/Pictures
echo "Backup complete. Delete all records on the phone."
cd /Volumes/Foo\'s\ Phone\ One\ Pictures
find . ! -type d -delete
echo "Deleted."
今天当我运行我的脚本时,我不小心忘记插入手机,后来我惊讶地发现我本地文件夹中的所有图片文件也被删除了。我想这是因为它没有找到我手机的图片文件夹,所以它在运行命令时仍然在我的本地文件夹中找到。 ! -type d -delete"。
所以现在只想问一下检查卷是否安装在Mac OS的shell脚本中的最佳方法,以及卷的名称是否为'和空间?
谢谢你们。
答案 0 :(得分:0)
要检查卷是否已安装,
您只需使用[ -d ... ]
命令检查目录是否存在,例如:
[ -d "/Users/foo/Phone Backups/Phone One/Pictures" ] || exit 1
但这不是最重要的问题。 不检查命令的退出代码是真正的问题, 并且它很容易导致数据丢失,如您的示例所示。
你应该经常检查命令的退出代码,
特别是当出现危险事件时,例如删除源文件。
在此示例中,cp
命令在未装入卷时失败,
你可以检查并处理它。
例如:
fatal() {
echo fatal: "$@"
exit 1
}
cd "/Users/foo/Phone Backups/Phone One/Pictures" || fatal 'Could not cd into backups dir'
这可能会有点繁琐,因为您有许多可能失败的命令。
所有cd
,cp
,find
,rm
都可能失败。
另一种方法是在shell中设置一些标志,以便在程序失败或其他可疑事件发生时自动退出,例如引用未定义的变量。 只需在脚本的顶部添加它,即使在中间出现故障的情况下运行也会更安全:
set -euo pipefail
答案 1 :(得分:0)
这是一个非常普遍且有风险的问题,不仅适用于装载量。
当你开始做破坏性的东西时,总是明智地仔细检查你是否在正确的文件夹中。 rm -fr
可能会毁了你的一天。
简单示例脚本:
#!/bin/bash
# Simple check to see wetter we are in the correct folder
if [ $(pwd) == '/home/foo/files' ]; then
echo "I'm in the correct folder"
# do what you need to do...
else
echo "This folder [$(pwd)] is NOT the correct folder! Abort..."
fi
答案 2 :(得分:0)
limit="some limit"
df /User 2> /dev/null | awk -v limit=$limit '$1 != "Filesystem" { if ($4 < limit) { print "There is not enough space";exit 1 } }'
if [[ $0 != "1" ]]
then
do stuff here.....
fi
这里我们设置一个限制来检查文件系统空间,然后我们使用限制集通过awk在/ User管道上运行df命令。如果没有挂载的文件系统,则命令的返回状态为1。如果没有足够的空间,awk也会返回1.只有当返回状态不是1时才能继续。