Почему звездочка дает неожиданные результаты при поиске? [дубликат]

Это на этот вопрос уже есть ответ:

Я новичок в Bash. Из документации по поиску файлов :

Вы хотите найти каждый файл в ~ / mydir и всех его подкаталогах рекурсивно с расширением файла .htm (или .HTM или .Htm ...) и удалите его. Я видел много попыток вроде rm -rf ~ / mydir / *.htm, которые действительно не подходят. Правильным решением будет

 find ~ / mydir -iname '* .htm' -exec rm {} \; 
 

-iname говорит, что вы хотите выполнить поиск без учета регистра имя файла. '*. Htm' заключен в одинарные кавычки, чтобы bash не раскрыл *, что приведет к неожиданным результатам.


Вопрос: Что дает звездочка с кавычками и без них? Почему вы решили использовать кавычки, а не нет?

0
задан 4 March 2018 в 18:47

3 ответа

Без кавычек оболочка разворачивает *.htm до списка файлов и передает этот список find. С кавычками оболочка обеспечивает пять символьных строк *.htm как аргумент find.

, Например, с кавычками:

$ ls
a.htm  b.htm
$ echo find . -iname '*.htm'
find . -iname *.htm
$ find . -iname '*.htm'
./b.htm
./a.htm

вышеупомянутые работы, как желаемый. Без кавычек, find дан аргументы, что это не знает, как обработать:

$ echo find . -iname *.htm
find . -iname a.htm b.htm
$ find . -iname *.htm
find: paths must precede expression: b.htm
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
0
ответ дан 5 March 2018 в 04:47
  • 1
    Спасибо SuB для быстрого answe. rIMHO " другие версии Ubuntu" должен быть назван " более старый versions" как в более новых Выпусках Ubuntu существуют более новые версии DPDK. Спасибо за соединение блога это - хорошее начало, поскольку существуют связанные пакеты большего количества dpdk (см. launchpad.net/ubuntu/+source/dpdk , чем просто dpdk пакет сам, что Вам нужен dependeing, что Вы хотите сделать с ним. – Christian Ehrhardt 20 October 2016 в 23:40

Как насчет примера сначала, здесь мы ищем все файлы с .htm расширение (нечувствительное к регистру) рекурсивно:

$ tree 
.
├── spam
│   ├── egg.htm
│   └── egg.Htm
├── spam.htm
└── spam.Htm


$ find . -type f -iname *.htm
./spam.htm
./spam.Htm

$ find . -type f -iname '*.htm'
./spam.htm
./spam/egg.htm
./spam/egg.Htm
./spam.Htm

, Поскольку Вы видите в первом случае, где я не использовал заключения в кавычки -iname *.htm, имя файла было подвергнуто шарику (*) расширение сначала (сделанный оболочкой, прежде чем find запустится), поскольку я не использовал кавычки и результата в:

find . -type f -iname spam.htm spam.Htm

т.е. все файлы в текущем каталоге, имеющем расширение .htm (нечувствительный к регистру). В результате, хотя ./spam подкаталог имеет два файла с .htm расширение, но они не будут найдены, поскольку мы теперь ищем файлы spam.htm или spam.Htm.

, С другой стороны, во втором случае find . -type f -iname '*.htm', мы использовали заключение в кавычки, таким образом, имена файлов не будут подвергнуты расширению шарика следовательно, мы получим желаемый результат.

0
ответ дан 5 March 2018 в 04:47
  • 1
    Я получаю подвешивание после набора сообщений как это: Допустите ошибку us.archive.ubuntu.com пакеты xenial-updates/multiverse amd64 – Steve Simlo 20 October 2016 в 22:30

Я верю тому, что Вы стремитесь понять, названное Заключение в кавычки процесса. Заключение в кавычки работ с двойными кавычками и одинарными кавычками.

при размещении текста в двойных кавычках все специальные символы, используемые оболочкой, теряют свое значение, кроме $ (знак доллара), \(обратная косая черта), и '(назад галочка).

Одинарные кавычки подавляют все расширения.

Символы Выхода - также что-то, чтобы быть обращенными внимание в таких ситуациях. Можно предшествовать символу с \(обратная косая черта) для превращения его в Символ Выхода. Это часто делается в двойных кавычках для выборочного предотвращения расширения.

echo "This bowl costs \$10.00"
This bowl costs $10.00

Здесь $, как говорили бы, был бы Символ ESC.

0
ответ дан 5 March 2018 в 04:47

Другие вопросы по тегам:

Похожие вопросы: