1 つ以上の *.flac ファイルを繰り返し検索します。同じディレクトリに* .cueファイルがない場合は、ディレクトリ名を印刷します。

1 つ以上の *.flac ファイルを繰り返し検索します。同じディレクトリに* .cueファイルがない場合は、ディレクトリ名を印刷します。

1つ以上のファイルを含むフォルダを検索するのに役立ちますが、同じフォルダにファイルがない場合は、*.flacフォルダ名を印刷してください。*.cue

これに対して動作するecho、find、grep、ls、perl、スクリプトコマンドなどはありますか?

macOS端末でzshを使用しています...ありがとう!

答え1

zsh globのみを使用すると、簡単にこれを行うことができます。

has() ()(($#)) $REPLY/?*.$1(NDY1)
print -rC1 -- **/*(NDFe['has flac && ! has cue'])

D隠しファイル/ディレクトリを無視するには、sを削除します。その後、?名前付きの隠しファイルをルート名の空.flacのflacファイルではなく、拡張子のない隠しファイルとして処理するために使用したflacファイルを削除することもできます。

たとえば、参照してください。zshの特定のファイルとファイルタイプの存在の条件付きテストここで使用されている建築タイプの詳細については、こちらをご覧ください。

これを次のように拡張できます。

has_at_least() ()(($# >= $1)) $REPLY/?*.$2(NDY$1)
print -rC1 -- **/*(NDFe['has_at_least 3 flac && ! has_at_least 1 cue'])

ファイルが3つ以上あり、ファイルがflacないディレクトリの場合cue

または:

has_from_to() ()(($# >= $1 && $# <= $2)) $REPLY/?*.$3(ND)
print -rC1 -- **/*(NDFe['has_from_to 1 inf flac && has_from_to 0 0 cue'])

または実際には、次のようなものが好きで実行します。

has() {
  local -A minmax=("$@") count
  local file ext n=${#minmax}
  for file ($REPLY/?*.*(ND)) (( ++count[\$file:e] ))
  for ext ("${(k@)minmax}")
    (( count[\$ext] >= ${minmax[$ext]%-*} &&
       count[\$ext] <= ${minmax[$ext]#*-} &&
       n-- ))
  (( n == 0 ))
}

print -rC1 -- **/*(NDFe['has flac 1-inf txt 2-6 cue 0-0'])

少なくとも1flac秒、2〜6txt秒、およびなしを含むディレクトリの場合cue

関連情報