我的印象是,在搜索以.fastq结尾的文件时使用D1可能更安全。例如,./将阻止捕获文件.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或一般的./*有什么意义吗?
发布于 2019-02-25 13:41:28
这在一开始是令人惊讶的通配符行为,因为对*通配符的描述说:
匹配任何字符串,包括空字符串。
..。直到你意识到,当句点是文件名的第一个字符时,句点就有点特别了。3.5.8 Filename Expansion中的介绍性文本说:
当一个模式用于文件名展开时,字符‘.’除非设置了shell选项,否则必须在文件名开始时或紧接斜杠后面显式匹配。
steeldriver评论说,用./前缀通配符的“使用模式”对于在bash shell中使用前导破折号处理名称很有用。它对通配符/文件名扩展没有影响,但如果文件名以这些程序可能误解为选项的字符开头,则更安全/更容易处理文件名。例如:
# 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..。我看到文件名了。
为了演示目的,这是一个简单的示例;请参见为什么打印比回声更好?中的其他原因。其他实用程序将被其他选项绊倒,所以最好尽可能安全地将文件名呈现给实用程序。如果不将通配符前缀为“转义”文件名,则必须以其他方式“保护”您的实用程序;一个常见的方法是使用--发出选项结束的信号,例如:
for file in *n
do
mv -- "$file" backup/"$file"
done..。它将安全地将-n文件名传递给mv (如set -x中所示):
mv -- -n backup/-nhttps://unix.stackexchange.com/questions/502884
复制相似问题