特定のサイズのファイルに対して繰り返し圧縮されたアーカイブを検索します。

特定のサイズのファイルに対して繰り返し圧縮されたアーカイブを検索します。

複数のファイルを含むフォルダがあります。これらのファイルは.xmlまたは.zipファイルです。これらの.zipファイルには.xmlおよび/または.zipファイルが含まれています。これには、またはなども.zip含まれます...最終的にファイルが見つかるまで。.xml.zip.xml

つまり、私の.xmlファイルを見つける前に複数の「レベル」のzipを持つことができます(下記の例を参照)。

私の要件は何を検出することですZIPファイルには、100Mbを超える1つ以上のXMLファイルが含まれています。 ZIPファイルがこの状況にある場合は、別のディレクトリ(たとえば~/big-files)に移動する必要があります。また、圧縮されていない.xmlファイルが100 Mbを超える場合は、このディレクトリに移動する必要があります。

たとえば、

foo1.xml
foo2.xml
baz.xml [MORE THAN 100Mb]
one.zip
  +- foo.xml
  +- bar.xml [MORE THAN 100Mb]
  +- foo.xml
two.zip
  +- foo.xml
  +- zip-inside1.zip
  |   +- bar.xml [MORE THAN 100Mb]
  +- foo.xml
three.zip
  +- foo.xml
  +- zip-inside2.zip
  |   +- zip-inside3.zip
  |       +- foo.xml
  |       +- bar.xml [MORE THAN 100Mb]
  +- foo.xml
four.zip
  +- foo.xml
  +- zip-inside1.zip
      +- foo.xml

この例ではbaz.xmla.zipTwo.zipそしてThree.zip~/big-files少なくとも100 Mbを超えるXMLファイルをホストするので、に移動する必要があります。4.zip

Bashシェルでこれをどのように達成できますか?

ありがとうございます。

ベストアンサー1

まずインストールしてくださいAVFS、アーカイブ内に透過的なアクセスを提供し、コマンドを実行するファイルシステムですmountavfs。バラより圧縮アーカイブを再帰的にgrepする方法は?背景。

それ以降は、/path/to/archive.zip認識されたアーカイブの場合、~/.avfs/path/to/archive.zip#そのアーカイブの内容を含むように見えるディレクトリです。

has_large_file_rec引数として渡されたzipファイル内で大きなXMLファイルを見つけ、含まれている各zipファイルから自分自身を再帰的に呼び出すヘルパースクリプトを作成します。スクリプトが大きなXMLファイルを見つけると、いくつかの出力が生成されます。大きなXMLファイルを見つけると検索を停止できるため、効率を上げるために出力が切り捨てられます。

#!/bin/sh
## auxiliary script has_large_file_rec
find "$1#" -name '*.zip' -type f -exec has_large_file_rec {} \; \
        -o -name '*.xml' -type f -size +1024k -print | head -n 1

最上位レベルで大容量ファイルが見つかった場合は、そのファイルを大容量ファイルディレクトリに移動します。

find "~/.avfs$PWD" \
  -name '*.zip' -sh -c '
      a=$(has_large_file_rec "$0")
      if [ -n "$a" ]; then mv "$0" ~/big-files/; fi
                       ' {} \; -o \
  -name '*.xml' -type f -size +1024k -exec mv {} ~/big-files/ \;

おすすめ記事