1

Я пытаюсь удалить файл ~$bgka.mod из моего текущего каталога в оболочке Cygwin. Когда я перечисляю все мои файлы в этом каталоге, он обнаруживается:

$ ls
~$bgka.mod   CaBK.mod     hcdist.hoc    mcdist.hoc      pbc.hoc
500net       ccanl.mod    hcell.bcell   mcell.bcell     pgc.hoc
50knet.hoc   gcdist.hoc   hcell.gcell   mcell.gcell     phc.hoc
bcdist.hoc   gcell.bcell  hcell.hcell   mcell.hcell     pmc.hoc
bcell.bcell  gcell.gcell  hcell.mcell   mcell.mcell     ppsyn.mod
bcell.gcell  gcell.hcell  hyperde3.mod  mod_func.c      README.html
bcell.hcell  gcell.mcell  ichan2.mod    mosinit.hoc     run50knet.bash
bcell.mcell  Gfluct2.mod  inhsyn.mod    nca.mod         screenshot.jpg
bgka.mod     gskch.mod    LcaMig.mod    parameters.dat  tca.mod

когда я пытаюсь использовать rm ~$bgka.mod я получаю следующую ошибку:

$ rm ~$bgka.mod
rm: cannot remove ‘~.mod’: No such file or directory

Кроме того, я попытался удалить файл из проводника Windows и Windows cmd.exe но он не отображается ни в одном из этих окон.

Как я могу удалить это?

3 ответа3

2

Вам нужно указать имя файла:

rm '~$bgka.mod'

обсуждение

Без кавычек оболочка считает, что $bgka является переменной оболочки и подставляет в ее текущее значение. Поскольку bgka никому не назначен, он подставляется в пустую строку. В результате оболочка пытается удалить файл с именем ~.mod . Этот файл не существует. Вот почему вы получаете ошибку:

rm: cannot remove ‘~.mod’: No such file or directory

Заключение имени файла в одинарные кавычки решает эту проблему, потому что оно говорит оболочке не делать никаких подстановок.

Вы можете увидеть разницу между одинарными кавычками и без кавычек с помощью простого выражения echo :

$ echo ~$bgka.mod '~$bgka.mod'
~.mod ~$bgka.mod
2

Я пытаюсь удалить файл ~ $ bgka.mod из моего текущего каталога

~ и $ - специальные символы в bash.

Вы можете либо избежать их, используя \ либо поместить аргумент в одинарные кавычки ' .

Двойные кавычки нельзя использовать, так как «Заключение символов в двойные кавычки " сохраняет буквальное значение всех символов в кавычках, за исключением $ , `и \"

Использование:

rm \~\$bgka.mod

Или же:

rm '~$bgka.mod'

Расширение тильды

Если слово начинается с символа кавычки без кавычек ~ , все символы до первой косой черты без кавычек (или все символы, если без косой черты без кавычек) считаются префиксом тильды. Если ни один из символов в префиксе тильды не заключен в кавычки, символы в префиксе тильды, следующие за тильдой, рассматриваются как возможное имя для входа. Если это имя входа является пустой строкой, тильда заменяется значением переменной оболочки HOME . Если HOME не установлен, вместо него подставляется домашний каталог пользователя, выполняющего оболочку. В противном случае префикс тильды заменяется домашним каталогом, связанным с указанным именем входа.

Расширение Source Shell


Расширение параметров оболочки

Символ $ вводит расширение параметров, подстановку команд или арифметическое расширение. Имя параметра или символ, который должен быть расширен, может быть заключен в фигурные скобки, которые являются необязательными, но служат для защиты переменной, которая должна быть развернута, от символов, следующих непосредственно за ним, которые могут быть интерпретированы как часть имени.

Расширение Source Shell


квотирование

Цитирование используется для удаления специального значения определенных символов или слов в оболочке. Кавычки могут использоваться для отключения специальной обработки для специальных символов, для предотвращения распознавания зарезервированных слов как таковых и для предотвращения расширения параметров.

Каждый из метасимволов оболочки имеет особое значение для оболочки и должен быть заключен в кавычки, если он представляет себя.

Побег персонаж

Не-цитируемый обратный слэш \ является маскирующим Bash. Он сохраняет буквальное значение следующего символа, за исключением символа новой строки. Если появляется пара \newline, а сама обратная косая черта не заключена в кавычки, \newline обрабатывается как продолжение строки (то есть она удаляется из входного потока и фактически игнорируется).

Одинарные кавычки

Ограждающие символы в одинарных кавычках ' буквальное значение каждого символа в кавычках. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

Двойные кавычки

Заключение символов в двойные кавычки " сохраняет буквальное значение всех символов в кавычках, за исключением $ ,` и \ . Символы $ и `сохраняют свое особое значение в двойных кавычках. Обратная косая черта сохраняет свое специальное значение только тогда, когда за ней следует один из следующих символов: $ , `, " , \ или newline. В двойных кавычках удаляются обратные слэши, за которыми следует один из этих символов. Обратная косая черта предшествующих символов без специального значения остается неизменной. Двойная кавычка может быть заключена в двойные кавычки, если им предшествует обратная косая черта.

Цитирование источника:


Дальнейшее чтение

1

Приведенные выше ответы очень подробны и правильны. Полезный прием при работе с именами файлов, содержащих специальные символы, - это команда 'find'.

find -name "*bgka*" -exec rm {} \;

Если вы можете найти шаблон для соответствия в части имени, это самый простой способ обработки файлов, содержащих специальные символы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .