首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >rsync重命名dest目录中的重复文件

rsync重命名dest目录中的重复文件
EN

Stack Overflow用户
提问于 2022-08-31 12:22:28
回答 1查看 189关注 0票数 2

我已经实现了一个基于rsync的系统来将文件从不同的环境转移到其他环境。

我现在面临的问题是,有时文件的名称是相同的,但是路径和内容不同。

我想让rsync (如果可能的话)重命名重复的文件,因为我需要并使用--no-relative选项。

重复的文件可以通过两种方式发生:

  1. 在dest目录中已经有一个同名的文件。
  2. 在相同的rsync执行中,我们在不同的位置传输同名的文件。例:dir2 1/file.txt和dir2 2/file.txt

添加-b --suffix选项,允许我至少对前面提到的第一个复制文件的类型重复一次。

一个最低限度的示例(适用于基于Linux的系统):

代码语言:javascript
运行
复制
mkdir sourceDir1 sourceDir2 sourceDir3 destDir;
echo "1" >> sourceDir1/file.txt;
echo "2" >> sourceDir2/file.txt;
echo "3" >> sourceDir3/file.txt;
rsync --no-relative sourceDir1/file.txt destDir
rsync --no-relative -b --suffix="_old" sourceDir2/file.txt sourceDir3/file.txt destDir

有没有办法达到我的要求?

EN

Stack Overflow用户

发布于 2022-09-17 17:14:11

估计只有rsync是不可能的。你必须先列出一个文件列表,然后分析它才能解决这个问题。看一看这个命令:

代码语言:javascript
运行
复制
$ rsync --no-implied-dirs --relative --dry-run --verbose sourceDir*/* dst/
sourceDir1/file.txt
sourceDir2/file.txt
sourceDir3/file.txt

sent 167 bytes  received 21 bytes  376.00 bytes/sec
total size is 6  speedup is 0.03 (DRY RUN)

让我们使用它来创建源文件列表:

代码语言:javascript
运行
复制
mapfile -t list < <(rsync --no-implied-dirs --relative --dry-run --verbose sourceDir*/* dst/)

现在,我们可以循环如下所示的列表:

代码语言:javascript
运行
复制
declare  -A count
for item in "${list[@]}"; {
    [[ $item =~ ^sent.*bytes/sec$ ]] && break
    [[ $item ]] || break
    fname=$(basename $item)
    echo "$item dst/$fname${count[$fname]}"
    ((count[$fname]++))
}

sourceDir1/file.txt dst/file.txt
sourceDir2/file.txt dst/file.txt1
sourceDir3/file.txt dst/file.txt2

将回显更改为rsync,仅此而已。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73555851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档