bash -cで始まる単一のコマンドラインを使用して、ディレクトリ全体の数をどのように計算できますか?
接頭辞付きのファイルを除くすべてのファイルが返されます。
bash -c "stat /path/todir/**"
これにより、すべての.includeが返されます。 & ..は除外する必要があります。
bash -c "stat /path/todir/.*"
これはうまくいきますが、bash -cではうまくいかず、2行が必要です
shopt -s dotglob
stat /path/todir/**
これも
stat /path/todir/!(.|..)
答え1
拡張 glob オプションは現在のシェルにのみ表示されます。いいえ実行されたサブシェルで。また、globオプションを使用できるようにするには、サブシェルでそれを設定する必要があります。再帰降下は、他の拡張オプションが設定されている場合にのみ**
発生しますglobstar
。現在のディレクトリ要件については、単に次のものを使用できます。*
bash -c 'shopt -s dotglob; stat /path/todir/*'
完全なシェルコマンドリストで一重引用符を使用することに注意してください。より安全です。不要な変数拡張(リテラル文字列渡し)を防ぎ、引用符付き文字列を簡単に使用できます。
外部部分を制御できる場合は、呼び出し自体'..'
で拡張シェルオプションを次のように設定できます。
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