5

私のシェルスクリプトには、次のコードがあります

echo * | tr ' ' '\n'

ここで、 * を使用していたにもかかわらず、隠しファイルをスキップしていることに気付きました(.*) その後、明らかな変更を試みました

echo .* | tr ' ' '\n'

これにより、隠しファイルの問題が解決しました。しかし、私は*のこの奇妙な振る舞いに興味があります

.* は *
のサブセットであるため、望ましい出力

  1. echo * -> 隠しファイルを含むすべてのファイル

  2. echo .* -> すべての隠しファイル

  3. echo [^.]* -> 非表示でないすべてのファイル (現在は echo *)

したがって、echo * は echo [^.]* のように動作します。

エコーを使用して隠しファイルを含むファイルの完全なリストを取得するにはどうすればよいですか。ls -a は望ましい出力を与えていましたが、ls と dir の出力も同様でした。

4

2 に答える 2

6

シェルグロブ*は隠しファイルを無視するように定義されているため、期待どおりに機能します。そして隠しファイルにのみ.*展開されます。

一部のシェルでは、オプションを介してこの動作を変更できます。たとえば、は(POSIXに対して)不適合になることをzsh許可し、デフォルトでglobドットファイルも許可します。setopt dotglobbashにはを使用できますshopt -s dotglob。ただし、スクリプトは通常、グロブに対してPOSIXの動作を想定しているため、誤動作する可能性があることに注意してください。

すべてのファイルを取得するための最善の策は、グロブでエコーを使用しないことですが、たとえばfind . -maxdepth 1(エコーが必要な場合は使用できますがecho * .*、いずれかのグロブがどのファイルとも一致しない場合は問題が発生します。この場合、グロブパターン保持される場合があります)。

于 2013-02-27T07:27:17.390 に答える
3

これは、ファイル名の展開で説明されています

ファイル名の展開にパターンを使用すると、文字「.」シェル オプション dotglob が設定されていない限り、ファイル名の先頭またはスラッシュの直後にある は明示的に一致する必要があります。ファイル名を一致させる場合、スラッシュ文字は常に明示的に一致させる必要があります。それ以外の場合は、「.」キャラクターは特別扱いされません。

.*と一緒に含めたい場合*は、両方のパラメーターを echo に指定する必要があります

echo .* * | tr ' ' '\n'

または使用dotglob

shopt -s dotglob
echo * | tr ' ' '\n'

これはまだ and を除外...ます。

于 2013-02-27T07:31:15.497 に答える