У меня сложилось впечатление, что это может быть более безопасно использовать ./*.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
здесь или ./*
вообще?
./*
означает, что имена, начинающиеся с-
, не рассматриваются как параметры.Ответы:
Это изначально удивительное поведение с подстановочными знаками, так как описание для
*
подстановочного знака говорит:... пока вы не поймете, что период немного особенный, когда это первый символ имени файла. Вступительный текст
3.5.8 Filename Expansion
говорит:«Шаблон использования» префикса с
./
использованием подстановочных знаков полезен для обработки имен с начальным тире в оболочке bash , как прокомментировал Steeldriver. Он не влияет на расширение подстановочного знака / имени файла, но делает более безопасным / легче обрабатывать имена файлов, когда вы ссылаетесь на них, если они начинаются с символов, которые эти программы могут неправильно интерпретировать как параметры. Например:... и теперь, когда у меня есть файл с именем
-n
, если мне случится зациклить его с подстановочным знаком:... я не получаю вывод!
Но если я добавлю префикс подстановки
./
,... Я вижу имя файла.
Это простой пример для демонстрационных целей; см. также Почему printf лучше, чем echo? по этой причине и другие. Другие утилиты будут отключены другими опциями, поэтому лучше представить файлы утилит как можно более безопасно. Если вы не ставите префикс подстановки для «экранирования» имен файлов, вам придется «защищать» свои утилиты другими способами; Одним из распространенных является сигнал об окончании опций
--
, например:... который безопасно передаст
-n
имя файлаmv
(как показано нижеset -x
):источник