forループで './'を指定するためにglobを使用すると、どのような利点がありますか?

forループで './'を指定するためにglobを使用すると、どのような利点がありますか?

たとえば。./*.fastqを検索すると、ファイルがキャプチャされないようです。次の例に示すように、これは明らかに間違っています。.fastq./.fastq

TMP_DIR=$(mktemp --directory)
mkdir -p ${TMP_DIR}
(cd ${TMP_DIR}
 touch {a,b,c,}.fastq
 ls -a
 echo ""

 echo "# match all:"
 for f in *.fastq ; do
     echo "${f}"
 done
 echo ""

 echo "# with ./:"
 for f in ./*.fastq ; do
     echo "${f}"
 done
)
rm -rf ${TMP_DIR}
.
..
a.fastq
b.fastq
c.fastq
.fastq

# match all:
a.fastq
b.fastq
c.fastq

# with ./:
./a.fastq
./b.fastq
./c.fastq

ファイルと一致も一致も*.fastqありません。今ここで、または一般的に使用するために何が意味するのか疑問に思います。./*.fastq.fastq./*.fastq./*

ベストアンサー1

*ワイルドカードは次のように説明されているので、最初は素晴らしいワイルドカード動作です。

空の文字列を含むすべての文字列と一致します。

…その時代に何か特別なことがあったことに気づくまで最初ファイル名の文字。紹介テキストは次のとおり3.5.8 Filename Expansionです。

ファイル名拡張にパターンを使用する場合、シェルオプション dotglob が設定されていない限り、ファイル名の先頭またはスラッシュの直後の「.」文字は明示的に一致する必要があります。

./次のワイルドカードプレフィックス「使用パターン」Bash シェルでダッシュで始まる名前の処理、Steeldriverが述べたように。ワイルドカード/ファイル名拡張には影響しませんが、プログラムがオプションとして誤って解釈できる文字で始まる場合は、ファイル名を引用するときにファイル名を処理する方が安全で簡単です。たとえば、

# I want a file named `-n`
$ touch -n
touch: invalid option -- 'n'
Try 'touch --help' for more information.
$ touch -- -n
### ok
$ touch ./-n
### ok

...今私持つ-nワイルドカードを使用して繰り返す場合、名前がファイルの場合:

for file in *n
do
  echo "$file"
done

...何の結果も出ません!

./しかし、ワイルドカードの前にを追加すると

for file in ./*n
do
  echo "$file"
done
./-n

...ファイル名が見えます。

以下は、デモ目的のための簡単な例です。なぜprintfがechoより優れているのですか?これとは違う理由による。他のユーティリティは他のオプションでは機能しないため、できるだけ安全にユーティリティにファイル名を指定することをお勧めします。もしあなたならいいえファイル名を「エスケープ」するためのプレフィックスとしてワイルドカードを使用するには、別の方法でユーティリティを「保護」する必要があります。一般的な1つはoptionで終わることです--。たとえば、次のようになります。

for file in *n
do
  mv -- "$file" backup/"$file"
done

...下図のように-nファイル名を安全に渡します。mvset -x

mv -- -n backup/-n

おすすめ記事