Bash脚本复制文件夹的内容并覆盖目标?

时间:2015-03-24 17:10:42

标签: bash

我对bash脚本几乎不熟悉,并且我试图实现能够指定源位置(带有文件/子目录的目录)和多个目标目录的列表,以及列表复制时要从源中删除的文件/目录&更换。

脚本应循环遍历每个目标位置,从源复制文件并在目标位置替换它们,不包括要跳过的脚本中列出的任何文件/目录。

在PHP中,它将类似于:

$source = '/home/user1/public_html';
$destinations = array(
    'user2',
    'user3',
    'user4'
);
$exclude = array(
    '/uploads/custom',
    '/config/conf.php'
);
foreach ($destinations as $destination) {
    $dir = '/home/' .$destination. '/public_html';
    if (is_dir($dir)) {
        exec('cp -R ' .$source. '/* ' .$dir);
        // and somehow exclude overwriting any files / directories matching what's in the $exclude array
    }
}

所以,我的问题是,如何编写具有类似功能的bash脚本?

1 个答案:

答案 0 :(得分:0)

这是我最终如何做到的:

#!/bin/bash
while IFS= read -r line || [[ $line ]]; do
    if [[ -d "$line" ]]; then
        rsync -rv --exclude-from "exclude.txt" /home/source/public_html/ "$line"
    else
        echo "Directory $line does not exist!"
    fi
done < "accounts.txt"

这是从名为&#34; accounts.txt&#34;的文件中读取的。其中包含所有目标帐户目录,每行一个。例如:

/home/user1/public_html
/home/myblog/public_html

循环遍历每个目录,如果目录存在,则将文件从/ home / source / public_html复制到目标。它还从一个名为&#34; exclude.txt&#34;的文件中读取。包括每行一个,要排除的任何文件或目录。例如:

.git
/uploads/custom
/config/conf.php