我正在尝试使用该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/bash
version 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
同样,在调试该程序方面的任何帮助将不胜感激。
有一个陷阱,上面有and和/或关键字find
。or
适用于以下所有参数,包括操作(-ls
在您的示例中)。and
不带or
(或带有and
)的表达式将按读取顺序求值,最后一个终止符为false。没有implicit ()
。
因此,该命令find POD -type f -name *.mp3 -or -name *.ogg -ls
意味着
*.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] 删除。
我来说两句