web-dev-qa-db-ja.com

Bash:xファイル未満のフォルダーを検索する

X個未満の.flacファイルを含むディレクトリ内のすべてのフォルダを検索するにはどうすればよいですか?

7
Leda
  • サブディレクトリに最大42個の_.flac_ファイルがある場合は、すべてのサブディレクトリについて、サブディレクトリ名を出力します。ディレクトリでコマンドを実行するには、_-print_を_-exec … \;_に置き換えます。 POSIX準拠。

    _find . -type d -exec sh -c 'set -- "$0"/*.flac; [ $# -le 42 ]' {} \; -print
    _

    このコマンドは、ゼロの_.flac_ファイルを含むディレクトリの検索には機能しないことに注意してください(_"$0/*.flac"_は少なくとも1つのWordに展開されます)。代わりに、

    _find . -type d -exec sh -c 'set -- "$0"/*.flac; ! [ -e "$1" ]' {} \; -print
    _
  • Zshの同じアルゴリズム。 _**/*_は、現在のディレクトリとそのサブディレクトリ内のすべてのファイルに再帰的に展開されます。 **/*(/)は展開をディレクトリに制限します。 {.,**/*}(/)は現在のディレクトリを追加します。最後に、_(e:…:)_は、シェルコードが0を返す一致に展開を制限します。

    _echo {.,**/*}(/e:'set -- $REPLY/*.flac(N); ((# <= 42))':)
    _

    これは、読みやすくするために2つのステップに分けることができます。

    _few_flacs () { set -- $REPLY/*.flac(N); ((# <= 42)); }
    echo {.,**/*}(/+few_flacs)
    _

変更ログ
•x = 0を正しく処理します。

$MAXを独自の制限に置き換えます。

find -name '*.flac' -printf '%h\n' | sort | uniq -c | while read -r n d ; do [ $n -lt $MAX ] && printf '%s\n' "$d" ; done

注:これにより、.flac0の間にいくつかの$MAXファイルがあるすべてのサブディレクトリが出力されます(両方とも除外されます)。

2
cYrus