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
主な点は次のとおりです。rsync
mv
ファイルが同じファイルシステムにない場合は、より高速です。。