首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用glob的for循环中指定'./‘有什么好处吗?

在使用glob的for循环中指定'./‘有什么好处吗?
EN

Unix & Linux用户
提问于 2019-02-25 13:32:30
回答 1查看 654关注 0票数 10

我的印象是,在搜索以.fastq结尾的文件时使用D1可能更安全。例如,./将阻止捕获文件.fastq。这显然是错误的,如下例所示:

代码语言:javascript
复制
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}
代码语言:javascript
复制
.
..
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或一般的./*有什么意义吗?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-02-25 13:41:28

这在一开始是令人惊讶的通配符行为,因为对*通配符的描述说:

匹配任何字符串,包括空字符串。

..。直到你意识到,当句点是文件名的第一个字符时,句点就有点特别了。3.5.8 Filename Expansion中的介绍性文本说:

当一个模式用于文件名展开时,字符‘.’除非设置了shell选项,否则必须在文件名开始时或紧接斜杠后面显式匹配。

steeldriver评论说,用./前缀通配符的“使用模式”对于在bash shell中使用前导破折号处理名称很有用。它对通配符/文件名扩展没有影响,但如果文件名以这些程序可能误解为选项的字符开头,则更安全/更容易处理文件名。例如:

代码语言:javascript
复制
# 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的文件,如果我碰巧用通配符循环它:

代码语言:javascript
复制
for file in *n
do
  echo "$file"
done

..。我没有输出!

但如果我在通配符前加上./

代码语言:javascript
复制
for file in ./*n
do
  echo "$file"
done
./-n

..。我看到文件名了。

为了演示目的,这是一个简单的示例;请参见为什么打印比回声更好?中的其他原因。其他实用程序将被其他选项绊倒,所以最好尽可能安全地将文件名呈现给实用程序。如果不将通配符前缀为“转义”文件名,则必须以其他方式“保护”您的实用程序;一个常见的方法是使用--发出选项结束的信号,例如:

代码语言:javascript
复制
for file in *n
do
  mv -- "$file" backup/"$file"
done

..。它将安全地将-n文件名传递给mv (如set -x中所示):

代码语言:javascript
复制
mv -- -n backup/-n
票数 15
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/502884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档