编辑:为了更深入地了解我想要实现的目标,我将给出下面的示例(部分团队的文件夹结构很差,我们的目标是修复它):
来源:
/ShopA/Finances/Costs/contents
/ShopB/Finances/Costs/contents
/ShopC/Finances/Costs/contents
目的地:
/Finances/Costs/ShopA/contents
/Finances/Costs/ShopB/contents
/Finances/Costs/ShopC/contents
我有列表(作为文件、source.txt
和destination.txt
、以及作为数组)来准确说明哪些文件需要复制到哪个目录,我遇到的麻烦是弄清楚如何将源文件复制到其各自的目的地,而无需执行手动进行,因为有数百个文件需要复制。
源列表和目标列表逐行匹配。例如,source.txt
文件中的第 1 行与文件中的第 1 行匹配destination.txt
。
我尝试了以下方法但没有成功:
rsync -arv --files-from=/home/user/Desktop/source.txt / --files-from=/home/user/Desktop/destination.txt /
^只能有一个目的地,行不通。
for ((i = 0; i < ${#destination[@]}; i++)); do
rsync -arv --files-from=/home/im-admin/Desktop/source.txt / "${destination[@]}"
done
^我知道我做错了,但需要帮助弄清楚如何让它将文件直接从源文件第一行复制到目标文件(或数组)第一行,因为每个源文件夹和目标文件夹都是唯一的。
答案1
在 Bash 中,如果您已经有一对有序数组,且其元素之间具有一一对应关系,则使用循环为每对数组执行命令非常简单:
for i in "${!sources[@]}"; do
echo rsync -av -- "${sources[i]}" "${destinations[i]}"
done
(echo
当您对所看到的结果感到满意时,请删除 来实际复制您的文件)。
应用于数组变量的前缀!
使其扩展到其索引列表。
我省略了-r
选项 torsync
因为它是由 暗示的-a
。
存储在文本文件中的路径列表,每行一个(当然,假设您的文件路径不能包含任何换行符),可以使用以下命令读入数组:
mapfile -t surces <source.txt
mapfile -t destinations <destination.txt
mapfile
(或等效的readarray
)将其标准输入拆分为换行符(或使用该选项显式指定的分隔符-d
)。该-t
选项指示它删除分隔符本身,否则分隔符将被保留为每个数组元素的最后一个字符。