特定の名前パターンを使用して、何百万ものファイルを別のディレクトリに移動します。

特定の名前パターンを使用して、何百万ものファイルを別のディレクトリに移動します。

Linuxシステムには、次の命名法を使用する何百万ものファイルがあります。

1559704165_a1ac6f55fef555ee.jpg

最初の10桁はタイムスタンプ、次の10桁_は特定のIDです。特定のファイル名IDと一致するすべてのファイルを別のフォルダに移動したいと思います。

ファイルを含むディレクトリでこれを試しました。

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

しかし、エラーメッセージが表示されます。

bash 1559704165_a1ac6f55fef555ee.jpg: command not found

すると、mv ??????????_a1ac*.jpg 引数リストが長すぎるというエラーが発生します。少なくとも15の異なるファイル名パターンがあります。どうやって移動しますか?

答え1

以下を使用する必要があります。

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' \
-exec mv -t destination "{}" +

つまり、maxdepth 1サブディレクトリがない現在のディレクトリから検索していることを意味します。

type fファイル検索のみを示します。

name '??????????_a1ac*.jpg'検索中のファイルと一致するパターン。

mv -t destination "{}" +一致するファイルをターゲットに移動することを示します。ここで、+一致する新しいファイルが古いファイルに追加されます。たとえば、次のようになります。

mv -t dest a b c d

ここで、abcd は別のファイルです。

答え2

注文、

find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"

すべてのファイルのリストをすべてのファイルにパイプします!

find . -maxdepth 1 -type f -name `*_a1ac*.jpg` -print0 |\
xargs  -0 -r mv -t "/home/ubuntu/ntest"

動作します。

答え3

あなたは非常に近いです。この-nameオプションを使用する必要がありますfind。そしてパターンを引用することを忘れないでください。

だから

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' |xargs mv -t "/home/ubuntu/ntest"

答え4

mv同じホストシステム(使用中であると推測されます)からファイルを移動したい場合は、rsyncより高速なオプションにすることができます。

rsync -av --inplace -W /source/??????????_a1ac*.jpg /home/ubuntu/ntest/

--inplace-Wプロセスをスピードアップする準備をしてください。

これは別のものを作り出すのだろうか?パラメータリストが長すぎます。エラーその後、リストをフィードに提供できます。rsync

たとえば、リストを作成するには find を使用します。

find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txt

そしてそれを与えるrsync

rsync -av --inplace -W --files-from=/tmp/my_image_list.txt /path/to/files /home/ubuntu/ntest/

ソースは、あなたが提供するリストがあなたのソースに関連していると見なされる/path/to/filesためです。rsync


主な点は次のとおりです。rsyncmvファイルが同じファイルシステムにない場合は、より高速です。

関連情報