web-dev-qa-db-ja.com

単一のディレクトリにある多数のファイルを移動する最も効率的な方法は何ですか?

CentOS 5.x

これが繰り返し質問である場合は、お詫び申し上げます。 (ファイルの削除に関して)同様の質問をたくさん見ましたが、まったく同じシナリオではありません。

数十万のファイル(おそらく100万以上)を含むディレクトリがあり、別の問題の短期的な修正として、これらのファイルを別の場所に移動する必要があります。

議論のために、これらのファイルは元々/home/foo/bulk/に存在していて、/home/foo2/bulk2/に移動したいとします。

mv /home/foo/bulk/* /home/foo2/bulk2/を試してみると、「引数が多すぎます」というエラーが表示されます。

Google氏は、ファイルを一括で削除する別の方法として、findを実行することを教えてくれました。次のようなもの:find . -name "*.pdf" -maxdepth 1 -print0 | xargs -0 rm

何かを削除している場合は問題ありませんが、この場合はファイルを移動します... find . -name "*" -maxdepth 1 -print0 | xargs -0 mv /home/foo2/bulk2/のように入力すると、bashはファイルがディレクトリではないというメッセージを表示します。

あるディレクトリから別のディレクトリにファイルをまとめて移動するためにここで使用するのに最適なコマンドは何ですか?

10
Mike B

GNU mv 's -tオプションは、最後の引数に依存する代わりに、ターゲットディレクトリを指定します。

find . -name "*" -maxdepth 1 -exec mv -t /home/foo2/bulk2 {} +

オプションのないシステムを使用している場合は、中間シェルを使用して正しい順序で引数を取得できます(find … -exec … +は、ファイルのリストの後に追加の引数を置くことをサポートしていません)。

find . -name "*" -maxdepth 1 -exec sh -c 'mv "$@" "$0"' /home/foo2/bulk2 {} +

ファイルの代わりに親ディレクトリをmvingすることを検討してください:

mv /home/foo/bulk /home/foo2/bulk2 && mkdir /home/foo/bulk

(ただし、/home/foo/bulkは常に存在している必要があります。)

5
scott

多様性のために、私はこのようないくつかのケースでcpioを使用するのが好きです。

find tmp |cpio -v  -p --make-directories --sparse tmp2
0
Arthur Ulfeldt

GNU mv

find . -mindepth 1 -exec mv -t /tmp {} +

OS Xのようなmv -tはないが-print0xargs -0はあるシステムの場合:

find . -mindepth 1 -print0|xargs -0 -I, mv , /tmp

または、ファイル名にスペース、引用符、バックスラッシュ、または改行(OS Xのxargsを使用)または引用符、バックスラッシュ、または改行(GNU xargs):

ls|xargs -I, mv , /tmp
0
Lri