查找不适用于特定搜索的操作

巴斯博辛克

我正在尝试使用该find命令列出一组特定文件的大小,但没有输出。我使用的命令是:

find POD -type f -name *.mp3 -or -name *.ogg -ls

不会产生任何输出。尽管:

find POD -type f -name *.mp3 -or -name *.ogg

确实产生输出,我也尝试了以下操作:

-printf "%p %k KB\n"
-exec ls -ls '{}' \;
-print0

但是所有这些都没有输出。当我将这些操作中的任何一个与其他表达式一起使用时,例如:

find . -maxdepth 1 -type f -printf "%p %k KB\n"

我也得到了预期的输出。有人知道问题是什么吗?我在跑:

Linux irimi 3.10.37-1-MANJARO #1 SMP Mon Apr 14 20:56:29 UTC 2014 x86_64 GNU/Linux

aka是最新的Manjaro linux发行版。我使用的shell是:/bin/bashversion 4.3.8(1)-release

我的SHELLOPTS环境变量的内容是:

braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

我的BASHOPTS环境变量是:

cdspell:checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:hostcomplete:interactive_comments:nocaseglob:progcomp:promptvars:sourcepath

同样,在调试该程序方面的任何帮助将不胜感激。

安托万·埃默里特(Antoine Emerit)

有一个陷阱,上面有and和/或关键字findor适用于以下所有参数,包括操作(-ls在您的示例中)。and不带or(或带有and)的表达式将按读取顺序求值,最后一个终止符为false。没有implicit ()

因此,该命令find POD -type f -name *.mp3 -or -name *.ogg -ls意味着

  • 搜索(从POD目录开始)以查找文件---如果未找到文件:停止
  • else(找到文件)检查模式匹配*.mp3---如果模式匹配:STOP!(因为OR从这里开始应用,并且仅当上一个命令失败时才应用(仅对上一个命令有效,而对上一组命令无效)

因为你添加一个执行语句(-ls-exec-print在命令行中....)有没有隐含的-print指令,所以咱这1执行)的1所有条件)为真(文件和模式匹配)。如果删除最后-ls一个-print,则每个条件分支的末尾都有一个隐式分布。

  • 否则,如果模式不匹配,则搜索与该模式匹配的任何内容(文件/目录)*.ogg并列出它们(这-ls不是条件命令,只有在前一个命令/测试“模式*.ogg为true时才执行)。但是由于1), 2)仅针对NON mp3文件进行评估。如果没有.ogg文件,则看不到任何内容。

解决方案1在每个逻辑分支中重复执行命令

   find POD -type f -name "*.mp3" -ls -or -name "*.ogg" -ls

解决方案2加上(shell保护)括号

   find POD -type f \( -name "*.mp3" -ls -or -name "*.ogg" \) -ls

请注意,您应该保护模式,以避免在当前目录中评估外壳模式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章