Проблемы с пониманием разницы в выводе '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'
Другие вопросы по тегам