web-dev-qa-db-ja.com

同じ名前のファイルを含む複数のディレクトリをマージする

私は質問を掘り下げてきましたが、必要な正確な答えを見つけることができないようです。

複数のサブディレクトリがあるディレクトリがあります:

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.

基本的に、これらすべてのサブディレクトリを1つのディレクトリにマージしますが、同じ名前のファイルは上書きしません。これを行うには、各サブディレクトリ内のファイルの名前を変更する必要がありますか(例:foo --> foo_~10~)、その後、すべてのファイルを1つのサブディレクトリにマージしますか?

これに使用できる簡単なbashまたはシェルスクリプトはありますか?私はrsync、mv、cpのバリエーションをいくつか試しましたが、私が望むものはまだ得られていません。

3
Gerrrald1

次のようなスクリプトでこれを行うことができます

#!/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.}の順序を変更するだけです。

2
Stefan Hamcke