web-dev-qa-db-ja.com

ワイルドカードと隠しファイルを使用したBashforループ

単純なシェルスクリプトを作成するだけで、少し混乱します。

これが私のスクリプトです:

% for f in $FILES; do echo "Processing $f file.."; done

コマンド:

ls -la | grep bash 

生成:

% ls -a | grep bash
.bash_from_cshrc
.bash_history
.bash_profile
.bashrc

いつ

FILES=".bash*"

Ls -aと同じ結果(異なるフォーマット)が得られます。ただし、

FILES="*bash*"

私はこの出力を取得します:

Processing *bash* file..

これは期待される出力ではなく、私が期待するものでもありません。ファイル名の先頭にワイルドカードを付けることはできませんか?それは 。どういうわけかファイル名「特別」の冒頭に?

設定

FILES="bash*"

また、動作しません。

25

隠しファイルの名前はFILES=".bash*"で始まるため、.は機能します

隠しファイルの名前はbではなくFILES="bash*"で始まるため、.は機能しません

文字列の先頭にあるFILES="*bash*"ワイルドカードでは隠しファイルが省略されているため、*は機能しません。

10
gregseth

Bashのデフォルトのグロブには、。で始まるファイル名は含まれていません。 (別名隠しファイル)。

あなたはそれを変えることができます

shopt -s dotglob

$ ls -a
.  ..  .a  .b  .c  d  e  f
$ ls *
d  e  f
$ shopt -s dotglob
$ ls *
.a  .b  .c  d  e  f
$ 

再度無効にするには、shopt -u dotglobを実行します。

48
nos

非表示と非表示が必要な場合は、dotglob(bash)を設定します

#!/bin/bash
shopt -s dotglob
for file in *
do
 echo "$file"
done
12
ghostdog74

はい、前面の.は特別であり、bashのマニュアルページに記載されているように(そしてほとんどのUnixシェルに共通)、通常は*ワイルドカードと一致しません。

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

10
alanc