サイズに応じてファイルを再帰的に移動して構造を維持する方法

サイズに応じてファイルを再帰的に移動して構造を維持する方法

各ファイルがサブフォルダにあるディレクトリツリーで、「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

最も簡単な方法は扱いにくい。あなたはそれを使用することができますグローバル予選ファイルの種類、サイズなどの基準に基づいてファイルを一致させます。これワイルドカードパターン **/すべてのレベルのサブディレクトリと一致します。これ履歴修飾子 htディレクトリとファイル名の基本部分を抽出する簡単な方法です。ディレクトリの作成は必要に応じて呼び出されます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にボトルネックを引き起こすことはほとんどありません。

おすすめ記事