【问题标题】:The best way to check if a volume is mounted in a shell script in Mac OS?检查卷是否安装在 Mac OS 的 shell 脚本中的最佳方法?
【发布时间】:2017-12-24 03:43:48
【问题描述】:

我有一个 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."

今天我运行脚本的时候不小心忘记插上手机了,然后我惊讶地发现我本地文件夹中的所有图片文件也都被删除了。我猜是因为它没有找到我手机的图片文件夹,所以当它运行命令“find . ! -type d -delete”时它还在我的本地文件夹中。

所以现在只想问一下,在 Mac OS 的 shell 脚本中检查卷是否挂载以及卷名是否包含 ' 和空格的最佳方法是什么?

谢谢大家。

【问题讨论】:

  • “df”命令的最佳起点。
  • 为什么知道卷名是否包含' 和空格很重要?我在您的代码 sn-p 中看不到任何需要的地方。

标签: bash macos shell mount


【解决方案1】:
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的时候才能继续。

【讨论】:

    【解决方案2】:

    要检查卷是否已安装, 您可以简单地使用[ -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
    

    【讨论】:

      【解决方案3】:

      这是一个非常常见且有风险的问题,不仅适用于安装卷。

      当你开始做破坏性的事情时,仔细检查你是否在正确的文件夹中总是明智的。 rm -fr 可能会毁了你的一天。

      简单示例脚本:

      #!/bin/bash
      # Simple check to see wether 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        • 2011-11-08
        • 1970-01-01
        • 2018-03-16
        • 2020-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多