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


11

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のようにタイプすると、ファイルがディレクトリではないというメッセージが表示されます。

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

回答:


16

最後の引数に依存する代わりに、GNU mv-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 {} +

find ... -exec sh -c 'blah "$ @" blah' sh {} + "(「シェルトリック」)を使用して、引数の順序に関する問題に対処できます。findutils( info)ドキュメンテーション; "sh -c"を検索
James Youngman

5

mvファイルの代わりに親ディレクトリを検討する:

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

(ただし、常に/home/foo/bulk存在している必要がある場合は、問題が発生する可能性があります。)


1
さらに、宛先ディレクトリが存在する場合に備えて、宛先ディレクトリ内のファイルをソースディレクトリ(大きなディレクトリ)に移動し、ディレクトリの名前を変更します。
sbenitezb 2013年

ありがとう-素晴らしい提案。この場合、ディレクトリは常に存在している必要があります。素晴らしいアイデアです。
Mike B

私はこの答えが何をするのか理解できないことを認めざるを得ません。なんでmkdir?そして、「いつでも存在する」そのディレクトリはどうですか?なぜこれはスピードアップするのでしょうか?
モニカヘドネック2018年

このコメントは1歳ですが、最後のコメントは5歳だったので、私も回答した方がいいと思いました...最初の2つの質問は相関しています。これmkdirは、フォルダ全体とその中のすべてが他のディレクトリに移動され、古いディレクトリに存在しなくなるためです。これにより、古いディレクトリが引き続き存在することが保証されます。ただし、常に存在する最初のディレクトリに依存するサービスが常に実行されている場合は、サービスを移動してから再作成するため、これでは不十分です。引数を少なくすることで、何も高速化せず、単純化します。
Lucas Leblanc

0

多様性のために、私はこのような場合にcpioを使用するのが好きです。

find tmp |cpio -v  -p --make-directories --sparse tmp2

1
コピー元とコピー先が同じファイルシステム上にある場合、このアプローチは非常に非効率的です(不要なコピー)。また-print0-0オプションとオプションを常に使用することをお勧めします。
pabouk 2013年

0

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

-3

指定された時間、次のことを試してください。

find . -name "*" -type f -mtime +7 -exec mv -t /folder/to/transfer/files {} +
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.