親ディレクトリに移動したい子ディレクトリには、多数のファイルとディレクトリがあります。ターゲットディレクトリに上書きする必要があるいくつかのファイルとディレクトリがすでにあります。ターゲットに存在するファイルのみが変更されていない状態にしてください。これを強制できますか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
' {} \;