合并包含同名文件的多个目录

合并包含同名文件的多个目录

我一直在研究问题但似乎找不到我需要的确切答案。

我有一个包含多个子目录的目录:

sent       sent.~16~  sent.~22~  sent.~29~  sent.~35~  sent.~41~  sent.~48~  sent.~54~  sent.~60~  sent.~67~  sent.~73~  sent.~8~
sent.~10~  sent.~17~  sent.~23~  sent.~3~   sent.~36~  sent.~42~  sent.~49~  sent.~55~  sent.~61~  sent.~68~  sent.~74~  sent.~80~
sent.~11~  sent.~18~  sent.~24~  sent.~30~  sent.~37~  sent.~43~  sent.~5~   sent.~56~  sent.~62~  sent.~69~  sent.~75~  sent.~81~
sent.~12~  sent.~19~  sent.~25~  sent.~31~  sent.~38~  sent.~44~  

每个子目录都包含一堆编号文件:

1.   11.  13.  15.  17.  4.  6.  8.
10.  12.  14.  16.  3.   5.  7.  9.

本质上,我想将所有这些子目录合并到一个目录中,但不覆盖同名文件。我是否需要更改每个子目录中文件的名称才能执行此操作(例如:foo --> foo_~10~),然后将所有文件合并到一个子目录中?

有没有一个简单的 bash 或 shell 脚本可以用于此?我尝试了 rsync、mv 和 cp 的一些变体,但还没有得到我想要的结果。

答案1

你可以用类似这样的脚本来做到这一点

#!/bin/bash

mkdir merged
for dir in sent*
do
    cd "$dir"
    for file in *
    do
        mv "$file" "$file"_"${dir#sent.}"
    done
    mv * ../merged
    cd ..
done

如果您想根据问题中的方案重命名每个文件。如果您想以这样的方式重命名它们,即它们的字典顺序反映文件最初所在的文件夹,只需切换字符串$file和的顺序${dir#sent.}

相关内容