如何使用以 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