将源目录复制到两个目标目录的 Bash 脚本,如果成功,则验证并删除源

Posted

技术标签:

【中文标题】将源目录复制到两个目标目录的 Bash 脚本,如果成功,则验证并删除源【英文标题】:Bash script to copy source catalog to two destination catalogs, verify and delete source if successful 【发布时间】:2013-03-02 20:36:46 【问题描述】:

操作系统:OSX 山狮

我正在尝试编写一个执行以下操作的脚本

检查目标 1 上是否存在 file1 (bitcasa) 如果存在,则将源文件夹复制到目标 1 如果文件不存在,则查找 bitcasa 进程并将其杀死,然后等待 60 秒,然后启动 bicasa。 再试一次(循环?)#bitcasa 有时会停止工作,必须重新启动。 检查目标 2 上是否存在 file2(nfs 共享) 如果存在,则将源文件夹复制到目标 1 如果文件不存在,请尝试挂载 nfs 共享。 再试一次(循环?)

验证复制的文件 如果文件复制成功删除源文件

我只希望脚本尝试几次,如果它 ant ping nas 主机,它应该放弃并在下次脚本运行时尝试。我想每 2 小时运行一次脚本。 crontab 接缝已在山狮中移除。

当我写下来时,我意识到它比我最初想象的要复杂一些。

首先关于挂载 nfs 共享,在 OsX 中,如果您弹出已挂载的 nfs 共享,则 /Volumes 中的文件夹将被删除。如果 nas 可用,确保我始终安装 nfs 共享的最佳方法是什么?这可能在脚本之外处理? 如果我手动安装 nfs 共享,我将需要创建 /Volumes/media,这将导致如果我使用 gui 安装共享将使用 /Volumes/media-1/ sins /Volumes/media vill 已经存在。

关于按名称杀死进程我不知道 PID,我尝试使用 linux 命令发现: 杀死ps -ef | grep bitcasa | grep -v grep | awk ‘print $2’ 这不起作用。

我不知道如何检查所有文件是否已成功复制,也许 rsync 可以解决这个问题?

我已经开始使用这个(未测试)

    #check if bitcasa is running (if file exist)
    if [ -f /Volumes/Bitcasa\ Infinite\ Drive/file.ext ]
    then
    rsync -avz /Users/username/source /Volumes/Bitcasa\ Infinite\ Drive/destination/
       else
       #Bitcasa might have stopped, check if process i running, kill if it is, then start bitcasa
    fi
    #Check if nfs share is mounted (if file exist)
    if [ -f /Volumes/media/file.ext ]
    then
    rsync -avz /Users/username/source /Volumes/media/
    fi
        else
        #nfs share (192.168.1.106:/media/) need to be mounted to /Volumes/media 

我会自己做更多的工作,但我知道我需要帮助。

或者我这样做是为了复杂吗?也许备份程序可以做到这一点?

【问题讨论】:

【参考方案1】:

对于您的kill ... ps 问题,您可以使用killall,它会杀死所有具有给定名称的进程

killall bitcasa

或查看man ps 并使用用户定义的格式,这样可以简化选择

ps -o pid,comm | awk '/bitcasa/  print $1; ' | xargs kill

对于 nas,如果您可以登录并安装 rsync 和 ssh(或已经安装),则无需安装任何东西。您可以将192.168.1.106:/media/ 作为 rsync 的目的地,rsync 会做所有必要的事情。

在任何情况下,如果需要,首先检查并挂载,然后在所有设置正确而不是相反时启动 rsync

if [ ! -f "/Volumes/Bitcasa Infinite Drive/file.ext" ]; then
    # kill bitcasa, restart bitcasa
fi

rsync -avz /Users/username/source "/Volumes/Bitcasa Infinite Drive/destination/"

同样适用于 nas

if [ ! -f "/Volumes/media/file.ext" ]; then
    # mount nas nfs share
fi

rsync -avz /Users/username/source "/Volumes/media/"

或者,如果你的 NAS 上有 rsync 和 ssh,只需

rsync -avz /Users/username/source 192.168.1.106:/media/

【讨论】:

谢谢。当然,我应该只 rsync 到我的 nas,而不关心它是否已安装。今天晚些时候将继续编写脚本。

以上是关于将源目录复制到两个目标目录的 Bash 脚本,如果成功,则验证并删除源的主要内容,如果未能解决你的问题,请参考以下文章

来自 root 帐户的 Bash 脚本和用户主目录 (Linux)

Linux下编写一脚本,实现本目录下文件的批量复制。

使用maven将多个资源目录复制到独立的目标目录

计算文件名字符,然后将这些文件复制到另一个目录

BASH 脚本使用输入和标准错误来长列表目录

如何 grep 字符串的目录,将其重写为其他内容并保存在 bash 中? [复制]