ディレクトリを自分にコピーするエラーをどのように修正しますか?

ディレクトリを自分にコピーするエラーをどのように修正しますか?

次のような状況を考えると...

<path>/mydir1/mydir2

...mydir2の場所持っていなければならないmydir1は上書きされますが、内部にあり、両方のディレクトリは実際には同じファイル名を持ちます。この問題はどのように解決されますか?

以下を試すか、次mv <path>/mydir/mydir/* <path>/mydir/のようなmv <path>/mydir <path>/ 結果になります。

mv: cannot move `<path>/mydir/mydir` to a subdirectory of itself, `<path>/mydir`

これは十分に簡単に見えますが、今は遅すぎるために理解することはできません。

回復するディレクトリは17です(各ディレクトリのパスは異なりますが、mydir名は同じです)。


確認すると、次の理由でエラーメッセージが表示されることがあります。

# cd /path/to/directory
#mv mydir/mydir ./
mv: 'mydir/mydir' を独自のサブディレクトリ './mydir' に移動できません。

また試しました:

#mv mydir/mydir/* mydir/
mv: 'mydir/mydir/otherdir1' を独自のサブディレクトリ 'mydir/otherdir1' に移動できません。
mv: 'mydir/mydir/otherdir2' を独自のサブディレクトリ 'mydir/otherdir2' に移動できません。

そして…

#mv /path/to/directory/mydir/mydir/otherdir1 /path/to/directory/mydir/
mv: '/path/to/directory/mydir/mydir/otherdir1' を独自のサブディレクトリ '/path/to/directory/mydir/otherdir1' に移動できません。

そして一時ディレクトリを使用してください。

#mv mydir/mydir ./mydir-temp
# mv mydir-temp/* mydir/
mv: 'mydir-temp/otherdir1' を独自のサブディレクトリ 'mydir/otherdir1' に移動できません。
mv: 'mydir-temp/otherdir2' を独自のサブディレクトリ 'mydir/otherdir2' に移動できません。


同様の質問を見つけました。」サブフォルダ内のすべてのファイル(隠しファイルを含む)を* nixの親フォルダに再帰的に移動するには?「これはmv bar/{,.}* .それが可能であることを示しています。

しかし、これは同じエラーを生成し、.どこからでも選択するのを混乱させます。..

#CDディレクトリ
# mv mydir/{,.}* .
mv: 'mydir/otherdir1' を独自のサブディレクトリ './otherdir1' に移動できません。
mv: 'mydir/otherdir2' を独自のサブディレクトリ './otherdir2' に移動できません。
mv: 'mydir/' を移動できません。 "./."へ:デバイスまたはリソースが使用中です。
mv: 'mydir/..' を './..' に移動できません。デバイスまたはリソースが使用中です。
mv:`./.file'を上書きしますか?ワイ


また同様の質問Linux mvコマンドは変です「はmv上書きされず、コピーが必要であることを示します。

#CDディレクトリ
#cp -rf ./mydir/*./
cp: `./otherdir1/file1'を上書きしますか?ワイ
cp: `./otherdir1/file2'を上書きしますか?ワイ
cp: `./otherdir1/file3'を上書きしますか?

これはうまくいくようです...ファイル(およびディレクトリ)が多いことを除いて、それぞれを確認したくありません!fこれはブロックしないでください。

OK、cpエイリアスを指定してcp -i(discoverを使用type cp)、thisを使用してバイパスすると\cp -rf ./mydir/* ./機能するようです。

私はディレクトリ/ファイルをある場所から別の場所に移動する問題を解決しましたが、この問題に正確に何が起こっているのか疑問に思います。mvこれは実際に意図的な機能ですか?ワーナーは提供する

答え1

まず、新しいディレクトリを外してから(衝突を避けるために一時的な名前を使用)、元のディレクトリを削除してから新しいディレクトリの名前を変更します。注:コンテンツを一括削除する必要があるため、コマンドを実行する前に慎重に考えて、まずバックアップがあることを確認してください。また、コマンド間でsを使用してこれを作成した&&ため、1つが失敗した場合、残りは実行されません。スクリプトでは問題ありませんが、手動で実行する場合は順番に入力することをお勧めします。質問はやめましょう。

mv <path>/mydir/mydir <path>/mydir-temp &&
rm -R <path>/mydir &&
mv <path>/mydir-temp <path>/mydir

答え2

最良の方法は次のとおりです。

for d in `ls -A`; do if [ "$d" != "TTT" ]; then cp -Rf $d TTT; fi; done

TTT自体を除いて、現在のディレクトリのすべてのディレクトリをTTTディレクトリに繰り返しコピーします。-Aのオプションを使用すると、隠されたlsすべてのディレクトリとファイルを考慮することができますが、特別なファイルは表示されません。および.."$d" != "TTT"自己コピーを避けるために、TTTディレクトリを条件付きで除外します。bash2つのパラメータでスクリプトを作成し、ローカルまたはシステムストアに保存し、必要に応じて使用できます。

関連情報