如何在命令工具上触发一系列命令?

如何在命令工具上触发一系列命令?

我之前有一个问题(已删除),我仍然不明白为什么很难理解我想问的问题,但我会再试一次,更清楚。

因此,我将多个文件夹从服务器 A 复制到服务器 B,但每个复制过程(“rsync”)的命令必须从命令行执行,每个文件夹执行一次。

因此,要将文件夹 A 复制到服务器 X,我执行一个 rsync 命令,复制完成后,我执行一个新的 rsync 命令将文件夹 B 复制到服务器 X。

我做了一些研究,可能可以帮助您满足我的需求。但我正在寻找一种同时编写多个命令的方法,如果前一个命令完成了他的操作(从而完成了复制),则该命令会一个又一个地触发。

;通常,多个命令在一行中用分号或与号分隔&&。之间的区别在于,如果第一个/上一个命令因分号而失败,它仍然会继续。如果命令产生错误并且您使用了&符号,那么它将停止。

因此,我在进程中使用了分号,让我的计算机整夜运行……但它只执行了第一个命令,即使我在一行上写了几个用分号分隔的命令。所以它应该一个一个地执行所有这些命令......所以首先:我如何正确执行多个命令,B,我的命令有什么问题?

sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-02-233653/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ; 
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-09-152837/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-20-201229/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-02-21-130931/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-05-113353/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-19-162703/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-05-13-215016/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap ;
sudo rsync -v -v -r -h -t —progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-06-01-231321/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap

为了便于阅读,我在这里用中断符将它们分开。通常是一整行

这通常以;分号字符结尾

答案1

为了可重复性,我建议将这些行放入一个小脚本中,但没有关键字sudo

#!/bin/bash

rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-02-233653/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap  
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-09-152837/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-01-20-201229/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-02-21-130931/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-05-113353/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-03-19-162703/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-05-13-215016/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap 
rsync -v -v -r -h -t --progress /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/2014-06-01-231321/SSDaeffer /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap

要运行这一系列命令,请键入:

chmod +x myscript.sh
sudo ./myscript.sh

这样,sudo在长命令期间就不会超时。脚本文件中不需要分号。默认情况下,每一行都可能失败并执行下一行(要更改此设置,请使用set -o errexit)。

我还注意到你的命令中有一些可疑之处。对于--progress您没有使用常规的选项连字符,但还有其他一些长相相似的角色。这可能是您所看到的错误的另一个来源。

答案2

请注意 rsync 的用法rsync [OPTION]... SRC [SRC]... DEST意味着这可以更简单地写为

 rsync -r -t -h /src1dir /src2 /src3 /destdir

不受 sudo 会话超时的影响。你没有问,但选项-a-r -t.

答案3

有很多方法可以做到这一点。如果每个方法sudo都不需要您输入密码,那么您尝试的方法将非常有效。既然如此,命令就会挂起,因为第二个命令会要求输入密码,而你却没有提供密码。因此,您需要一种运行一切的方法单身的 sudo称呼。以下是执行此操作的几种方法。

  1. 将命令写入脚本并运行脚本,sudo如 @Sebastian 中所述回答

  2. 运行一个rsync给出多个源文件夹的命令建议由@msw。

  3. 动态构建命令。看起来您想将所有SSDaeffer文件夹复制到/Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap.这意味着你可以简单地写

    sudo rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/*/SSDaeffer \
                    /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap  
    

    这会将SSDaeffer目录子文件夹的所有文件 夹复制/Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap.这假设你想要全部那里的文件SSDaeffer夹。如果您只需要其中一些,您可以将它们列出在文件中:

    $ cat file
    2014-01-02-233653
    2014-01-09-152837
    2014-01-20-201229
    2014-02-21-130931
    

    然后读取该文件以获取您想要的名称:

    sudo while read dir; do 
     rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/$dir/SSDaeffer \
                /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap;
    done < file
    

    如果您的文件夹名称可能包含空格或其他奇怪的字符,请改用:

    while IFS= read -r dir; do 
     rsync -vah /Volumes/My\ Book/Backups.backupdb/MbpScs-van-iSCS/$dir/SSDaeffer \
                    /Volumes/BackupMyBook/ViaMacbookMove/DitIsDeMap;
    done < file
    
  4. 使用 启动 root shell sudo -i。这将使您以超级用户身份登录,然后您可以随意运行命令:

    $ sudo -i
    Password:
    # rsync -avh /from/dir1 /to/dir
    # rsync -avh /from/dir2 /to/dir
    # rsync -avh /from/dir3 /to/dir
    

相关内容