複数のファイルを含み、指定されたサイズより大きいすべてのディレクトリでファイルを見つける方法は?

複数のファイルを含み、指定されたサイズより大きいすべてのディレクトリでファイルを見つける方法は?

指定されたサイズより大きいファイルが指定された数以上含まれているディレクトリ内のすべてのフォルダを見つける方法は?

ユースケースの例は、分割されたムービーファイルを含むフォルダを見つけることです。マージこのように( ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4)。

答え1

そしてzsh

x=42 size=M+1
print -rC1 -- **/*(NFe['()(($#)) $REPLY/*(N.L${size}Y${x}[$x]oN)'])

1MiBを超えるファイルを42個以上含むディレクトリが印刷されます。

  • **/*:再帰的ワイルドカード
  • (...): グローバル予選
  • NNulglob:一致するものがなくても文句を言わないでください。
  • F: ファイル形式の制限目次すべてF(少なくとも1つの項目を含む)。
  • e['code']:フィルタ評価はファイルに対してtrueをe返しますcode
  • ()(($#)) args: 引数の数がゼロでない場合にtrueを返す匿名関数
  • $REPLY:現在検討中のファイル(ここではディレクトリ)ですcode
  • $REPLY/*:内部のファイル。$REPLY/**/*サブディレクトリのファイル数も計算に置き換えられました。
  • .: 限定定期的なファイル(ディレクトリ、シンボリックリンク、fifo、デバイスを除く)。
  • LM+1:1より大きいファイル(ファイルサイズ1048577バイト以上)の場合、制限サイズは次の整数メガバイトに丸められます。
  • Y$x:私をやめてください。Xこれは最適化されていることが確認されました。
  • [$x]:選択するXリストの項目です(再最適化なので、code少なくとも1つの引数が渡されたことを確認してください)。
  • oN:このリストを並べ替えようとしないでください。

D隠しディレクトリ/ファイルも考慮するには、globの一方または両方に修飾子を追加できます。

ただし、後でこれらのファイルに対していくつかのタスクを実行するには、次のことを行う必要があります。

for dir in **/*(NF); do
  large_files=($dir/*(N.LM+1))
  (( $#large_files >= 42 )) && do-something-with $large_files
done

答え2

ありがとう@ムルわずかに変更されたコマンドは次のとおりです。

find . -type d -exec sh -c '[ $(find "$1" -type f -size +1M | wc -l) -gt 1 ]' _ {} \; -print

この例では、現在のディレクトリで1MBを超えるファイルを2つ以上含むすべてのフォルダを探します(フルパスの点を置き換えることができます)。

関連情報