..
何百または何千ものファイルがあるディレクトリにファイルを移動するにはどうすればよいですか?どの方法を使用するのかわからない。
なりすましの処理方法は多様であり、なりすましを無視する場合もあり、セキュリティを強化する必要がある場合もあります。 IOは本番サーバーなので重要です。しかし、与えられた数字が与えられた場合、重複していないファイルを求めるオプションはありません。権限やタイムスタンプなどを保存することが重要です。私たちはデータが何であるかわからないことがよくあります。
ああ、mv
必須ではありませんrsync
。cp
ソリューションを歓迎します。
注:CentOS 5.5を実行しているため、最新バージョンなので、そのバージョンで動作しない場合はお知らせください。
答え1
親のrsyncを使用することをお勧めします。
rsync -avPr -b --suffix='-original' child/* .
これにより、親ファイルの既存の重複ファイルがすべてバックアップされます。文書-もともと。
答え2
cp -bal . ..
これは現在のディレクトリのすべてをその上のディレクトリにコピーし、フルアクセスを維持し、可能であればハードリンクを使用してIOを最小化し、重複ファイル名を生成します〜
以来
rm -rf . ; cd .. ; rmdir <originaldir>;
答え3
この例では、ファイルは「/parent/old-dir」から「/parent」に移動されます。
cd /parent
rsync -av --progress old-dir/ .
rm -rf old-dir
rsyncの規則に従ってold-dir
。
答え4
mv -i
宛先が存在する場合にのみメッセージが表示されます。
yes n | mv -i …
ターゲットディレクトリに存在しないすべてのファイルを移動します。 FreeBSDとOSXではこれをmv -n …
。
これらのいずれも、ターゲットディレクトリ内の同じ名前の既存のディレクトリとディレクトリパラメータをマージしません。
もう一つの質問は、現在のディレクトリ内のすべてのファイルを処理する方法です。 2つの問題があります。すべてのファイルをインポートすること(*
ドットファイルを省略)とコマンドラインで実行されないことです。 Linux(またはより一般的にGNU findとGNU coreutilsを使用):
find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +
GNU findを使用し、GNU coreutils(または以前のGNU coreutils)を使用しないでください。
find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +
持ち運べる:
find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune
いつものように、zshを使用すると作業が簡単になります。内部的にはコマンドラインの長さに制限はないので、組み込みmv
コマンドを使用している場合はそれを心配する必要はありません。 glob修飾子を使用して、ドットファイルを無視しないように指示できますD
。制限事項:これはファイルシステム全体では機能しません(zsh 4.3.10ベース)。
zmodload zsh/files
mv -i -- *(D) ..