サブディレクトリ(およびファイル)を親ディレクトリに移動して上書きする方法は?

サブディレクトリ(およびファイル)を親ディレクトリに移動して上書きする方法は?

親ディレクトリに移動したい子ディレクトリには、多数のファイルとディレクトリがあります。ターゲットディレクトリに上書きする必要があるいくつかのファイルとディレクトリがすでにあります。ターゲットに存在するファイルのみが変更されていない状態にしてください。これを強制できますかmv?それ( mv * ..)は文句を言う

mv: cannot move `xyz' to `../xyz': Directory not empty

私は何を見逃していますか?

答え1

次のコマンドを使用してcp -r * ..ターゲットにコピーしたら、ソースを削除する必要がありますrm -rf *

「マージ」ディレクトリが利用できないと思いますmv

答え2

rsyncここが良い選択かもしれません。それは簡単ですrsync -a subdir/ ./

私のテストツリーの形式はfilename次のとおりですcontents

./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

ランニングrsync:

$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3

以下を提供します。

./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

その後、シミュレーションするにはmvソースディレクトリを削除する必要があります。

$ rm -r subdir/

与える:

./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir

これが間違っている場合は、目的の結果を提供する同様の例を提供できます(例:この回答の上部付近のテストツリーを使用)

答え3

rsyncパラメータを介してコピーした後、ソースを削除できます--remove-source-files

rsyncマニュアルページから:

--remove-source-files   sender removes synchronized files (non-dir)

答え4

/path/to/source/root以下は、下のファイルを下の対応するパスに移動するスクリプトです/path/to/destination/root

  • ソースとターゲットの両方にディレクトリがある場合、コンテンツは再帰的に移動されマージされます。
  • ファイルまたはディレクトリがソースにあるがターゲットにない場合は移動されます。
  • ターゲットにすでに存在するすべてのファイルまたはディレクトリは保存されます。 (特にマージされたディレクトリはソースにそのまま残っており、修正は容易ではありません。)

テストされていないコードに注意してください。

export dest='/path/to/destination/root'
cd /path/to/source/root
find . -type d \( -exec sh -c '[ -d "$dest/$0" ]' {} \; -o \
                  -exec sh -c 'mv "$0" "$dest/$0"' {} \; -prune \) \
    -o -exec sh -c '
        if ! [ -e "$dest/$0" ]; then
          mv -f "$0" "$dest/$0";
        fi
' {} \;

関連情報