在Mac OS中检查卷是否安装在shell脚本中的最佳方法是什么?

时间:2017-07-19 04:21:00

标签: bash macos shell mount

我有一个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脚本中的最佳方法,以及卷的名称是否为'和空间?

谢谢你们。

3 个答案:

答案 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'

这可能会有点繁琐,因为您有许多可能失败的命令。 所有cdcpfindrm都可能失败。

另一种方法是在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时才能继续。