各ファイルがサブフォルダにあるディレクトリツリーで、「300Mb」より大きいファイルを移動したいと思います。
例: 次のディレクトリ構造があります。
dirA/
dirA/file1
dirA/x/
dirA/x/file2
dirA/y/
dirA/y/file3
これは、各ファイルがサブフォルダに移動されるディレクトリツリーの「移動」である予想結果です。
dirB/ # normal directory
dirB/file1 # moved from dirA/file1
dirB/x/ # normal directory
dirB/x/file2 # moved from dirA/x/file2
dirB/y/ # normal directory
dirB/y/file3 # moved from dirA/y/file3
しかし、それではfind /path/ -type f -size +300m
どうなりますか?残念ながら、一部のファイルにはキーボードで見つけることができるさまざまな文字が含まれています。
私はこれを見ていましたワイヤー話はありますが、cpio
そのプログラムはよくわかりません...
PS:GNU Parallelをインストールすると速度が速くなりますか?
ベストアンサー1
最も簡単な方法は扱いにくい。あなたはそれを使用することができますグローバル予選ファイルの種類、サイズなどの基準に基づいてファイルを一致させます。これワイルドカードパターン **/
すべてのレベルのサブディレクトリと一致します。これ履歴修飾子 h
t
ディレクトリとファイル名の基本部分を抽出する簡単な方法です。ディレクトリの作成は必要に応じて呼び出されますmkdir -p
。
cd dirA
for x in **/*(.Lm+300); do
mkdir -p ../dirB/$x:h &&
mv -- $x ../dirB/$x
done
移植可能な方法はfind
。-exec
フラグメントを使用して各ファイルのシェルを呼び出すことです。
cd dirA
find . -type f -size +300000k -exec sh -c 'for x do
mkdir -p "../dirB/${x%/*}"
mv "$x" "../dirB/$x"
done' sh {} +
並列化は入力/出力にはほとんど役に立ちません。並列化を使用すると複数のCPUを利用できますが、CPUがI / Oにボトルネックを引き起こすことはほとんどありません。