グロブを使用してforループで './'を指定することに利点はありますか?


10

./*.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
通常のポイント./*は、で始まる名前が-オプションとして扱われないようにすることです。
チャールズダッフィー

回答:


15

*ワイルドカード文字の説明には次のように記載されているため、これは最初は意外なワイルドカードの動作です。

null文字列を含む任意の文字列に一致します。

... ファイル名の最初の文字がピリオドであることに気づくまで の紹介文3.5.8 Filename Expansionはそれを言っています:

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

ワイルドカードを前に付ける「使用パターン」は、steeldriverがコメントしたように、bashシェルで先頭にダッシュが付いた名前を処理するのに./役立ちます。ワイルドカード/ファイル名の展開には影響しませんが、それらのプログラムがオプションとして誤って解釈する可能性のある文字で始まる場合は、ファイル名を参照するときにファイル名をより安全/簡単に処理できます。例えば:

# 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 共通一つは持つオプションの終了を通知することです--例えば、:

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

...は安全に-nファイル名を渡しますmv(以下に表示されますset -x):

mv -- -n backup/-n
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.