Проблемы с пониманием разницы в выводе 'find' для bash с использованием быстрых, позиционных параметров
Поэтому я пытаюсь понять разницу между двумя результатами в Bash, чтобы углубить мое понимание позиционных параметров:
$ find ./*.md
one.md
two.md
three.md
four.md
а также:
$ ./findall.sh ./*.md
one.md
где findall.sh
является:
#!/usr/bin/env bash
find $1
В моем понимании, эти две операции должны быть идентичны, но использование позиционных параметров, похоже, возвращает только один элемент. Что я не получаю?
1 ответ
В обоих случаях ваш интерактивный bash расширяется ./*.md
перед звонком find
, Итак, ваша первая команда расширяется до этого:
find ./one.md ./two.md ./three.md ./four.md
Во втором случае ваша команда расширяется до следующего:
./findall.sh ./one.md ./two.md ./three.md ./four.md
Затем скрипт запускается и расширяет команду в скрипте так:
find ./one.md
Возможно, вы хотели процитировать подстановочный знак:
find './*.md'
./findall.sh './*.md'
Но в любом случае, find
потерпит неудачу, потому что первые аргументы find
(перед любыми аргументами, которые начинаются с -
) являются названиями каталогов, в которых нужно искать. Нет каталога с именем ./*.md
, так как /
не может встречаться в имени файла или каталога.
Возможно, вы имели в виду, чтобы найти все файлы, имена которых совпадают *.md
в любом месте под текущим каталогом:
find . -name '*.md'
Возможно, вы имели в виду это, чтобы найти все файлы в текущем каталоге (но не в подкаталогах), имена которых совпадают *.md
:
find . -maxdepth 1 -name '*.md'