Это на этот вопрос уже есть ответ:
Я новичок в Bash. Из документации по поиску файлов :
Вы хотите найти каждый файл в ~ / mydir и всех его подкаталогах рекурсивно с расширением файла .htm (или .HTM или .Htm ...) и удалите его. Я видел много попыток вроде rm -rf ~ / mydir / *.htm, которые действительно не подходят. Правильным решением будет
find ~ / mydir -iname '* .htm' -exec rm {} \;
-iname
говорит, что вы хотите выполнить поиск без учета регистра имя файла.'*. Htm'
заключен в одинарные кавычки, чтобы bash не раскрыл *, что приведет к неожиданным результатам.
Вопрос: Что дает звездочка с кавычками и без них? Почему вы решили использовать кавычки, а не нет?
Без кавычек оболочка разворачивает *.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]
Как насчет примера сначала, здесь мы ищем все файлы с .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'
, мы использовали заключение в кавычки, таким образом, имена файлов не будут подвергнуты расширению шарика следовательно, мы получим желаемый результат.
Я верю тому, что Вы стремитесь понять, названное Заключение в кавычки процесса. Заключение в кавычки работ с двойными кавычками и одинарными кавычками.
при размещении текста в двойных кавычках все специальные символы, используемые оболочкой, теряют свое значение, кроме $ (знак доллара), \(обратная косая черта), и '(назад галочка).
Одинарные кавычки подавляют все расширения.
Символы Выхода - также что-то, чтобы быть обращенными внимание в таких ситуациях. Можно предшествовать символу с \(обратная косая черта) для превращения его в Символ Выхода. Это часто делается в двойных кавычках для выборочного предотвращения расширения.
echo "This bowl costs \$10.00"
This bowl costs $10.00
Здесь $, как говорили бы, был бы Символ ESC.