递归查找最少一个 *.flac 文件,如果同一目录下没有 *.cue 文件则打印目录名

递归查找最少一个 *.flac 文件,如果同一目录下没有 *.cue 文件则打印目录名

我需要帮助搜索至少包含一个文件的文件夹,但如果同一文件夹中*.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 文件。

参见例如对 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'])

对于至少有 1 flacs、2 到 6 txts 且没有的目录cue

相关内容