如何使用以 bash -c 开头的单个命令行来统计整个目录?

如何使用以 bash -c 开头的单个命令行来统计整个目录?

如何使用以 bash -c 开头的单个命令行来统计整个目录?

这将返回除前缀为 . 的文件之外的所有文件。

 bash -c "stat /path/todir/**"

这将返回所有以 .包括 。 & .. 应排除在外。

bash -c "stat /path/todir/.*"

这可以工作,但不能在 bash -c 下使用,并且需要两行

shopt -s dotglob
stat /path/todir/**

这个也是

stat /path/todir/!(.|..)

答案1

扩展的 glob 选项仅对当前 shell 可见,并且不是到启动的子 shell。您还需要在子 shell 中设置它们,以使 glob 选项可用。只有设置了**另一个扩展选项,才会进行递归下降globstar。对于当前目录的要求,您只需使用*

bash -c 'shopt -s dotglob; stat /path/todir/*'

请注意在整个 shell shell 命令列表中使用单引号。它更安全,您可以避免不必要的变量扩展(传递文字字符串)并轻松使用带引号的字符串。

如果您可以控制外部的部分,则'..'可以在调用本身中将扩展 shell 选项设置为

bash -O dotglob -c 'stat /path/todir/*'

也就是说,如果find有使用类似外部实用程序的选项,您可以执行以下操作,即排除.(当前目录名称)并包含当前目录中的所有文件并stat一次性传递它。

find . ! -path . -exec stat {} +

答案2

bash -c -O extglob 'stat /path/todir/!(.|..)'

-O extglob启用额外的模式匹配运算符,包括!(pattern-list)否定运算符。

[-+]O [shopt_option]
         shopt_option is one of the shell options accepted by the shopt builtin  (see  
         SHELL  BUILTIN  COMMANDS  below). If shopt_option  is  present, -O sets the 
         value of that option; +O unsets it.

If the extglob shell option is enabled using the shopt builtin, several extended pattern matching
operators  are recognized.  In the following description, a pattern-list is a list of one or more
patterns separated by a |.  Composite patterns may be formed using one or more of  the  following
sub-patterns:

      ?(pattern-list)
             Matches zero or one occurrence of the given patterns
      *(pattern-list)
             Matches zero or more occurrences of the given patterns
      +(pattern-list)
             Matches one or more occurrences of the given patterns
      @(pattern-list)
             Matches one of the given patterns
      !(pattern-list)
             Matches anything except one of the given patterns

相关内容