Удаление всех файлов, который начинается с круглой скобки

Можно изменить синтаксические свойства символов с помощью modify-syntax-entry функция (C-h f modify-syntax-entry в emacs для большего количества информации):

Например, если Вы пишете .tex документы, Вы могли бы добавить следующее к Вашему .emacs:

(add-hook
 'TeX-mode-hook
 '(lambda ()
    (modify-syntax-entry ?_ "w")
    (modify-syntax-entry ?- "w")
))

Это говорит emacs рассматривать _ и - поскольку символы "слова", когда Вы находитесь в режиме TeX, таким образом передавать-слово и обратное слово, сделают то, что Вы хотите.

1
30.10.2013, 19:46
5 ответов

Оболочка интерпретирует командную строку с определенными правилами, которые необходимо рассмотреть здесь:

  • Можно выйти из метасимволов оболочки с \так, чтобы это вело себя как обычный символ.

  • Можно использовать одинарные или двойные кавычки и в них большинство (с двойными кавычками) или все (с одинарными кавычками), метасимволы оболочки теряют свое особое значение.

  • Кавычки не должны быть на границах слова, так, чтобы rm th"is fil"e совпал бы с rm "this file".

  • Символы []? * может использоваться для расширения имени файла. Им нельзя заключить в кавычки или оставить с этой целью.

Таким образом, возможные решения для Вашего случая rm -rf '('*, rm -rf "("* и rm -rf \(*. Я не знаю, почему последний не работал в Вашем случае. Возможно, существует некоторый пробел перед круглой скобкой?

Со следующей строкой необходимо смочь видеть, существуют ли какие-либо забавные символы в именах файлов:

for i in *; do od -c <<< "$i"; done
5
27.01.2020, 23:15
  • 1
    Перед круглой скобкой было пространство. Спасибо человек. –  Forethinker 30.10.2013, 19:48
  • 2
    ./ помогает в случае продвижения - в имени файла, так, чтобы это не было интерпретировано как опция. –  Michael Suelmann 30.10.2013, 19:59

Если Вы помещаете * внутри " или ' это не расширится (это - литерал * только).

Но можно поместить * за пределами ":

rm "("*

Однако это идентично rm \(* который Вы уже отправили. Таким образом, если это не работает, ни один Ваш, файлы не начинаются с ASCII ( символ, в конце концов (существуют символы Unicode, которые выглядят очень похожими), или Вы пробуете это в неправильном месте.

1
27.01.2020, 23:15
  • 1
    @Forethinker: Utf-8 использует установленный на ASCII. Это только для расширенных escape-последовательностей глифов, используются. Например, "нормальные" глифы как a, b, ,, ., ( и т.д. используются. Существуют однако глифы тот подобный взгляд. Например, это: оставленная белая круглая скобка трех байтов. –  Runium 30.10.2013, 19:51

Две вещи можно попробовать:

1) rm -f \\(*

(Вам не нужно -r если Вы не хотите рекурсивно удалить каталоги. Так как Вы сказали "файлы", я оставил его. rm -rf опасный инструмент и не должен использоваться, если он не необходим.)

2) комната-i *

Этот метод требует небольшого количества ручного вмешательства, но так как неалфавитно-цифровые символы имеют тенденцию сортировать сначала, вещи, которые Вы хотите удалить, имеют тенденцию подходить сначала, и Вы можете проблема a ^C когда Вы получили их.

Как примечание, при экспериментировании с нечетными подстановочными знаками, попытка использовать echo вместо rm сначала. Особенно при использовании rm -rf. Тем путем Вы видите то, что оболочка думает, что расширяется до (если что-либо) прежде, чем удалить вещи. Тем более, что иногда этот тип файла создается кем-то надеющимся you'l, делают что-то глупое и сдувают больше файлов, чем, что Вы намереваетесь.

0
27.01.2020, 23:15

Поскольку другие упомянули 3-й пример, который Вы включали, должен был работать. Как альтернатива Вы могли использовать find удалить эти файлы также.

Пример

Принятие следующих демонстрационных данных.

$ touch "(afile)"{1..5}
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)1
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)2
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)3
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)4
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)5

Теперь удалите использование файлов find (принятие Вас имеет версию GNU find):

$ find . -name "(*" -delete
$ ls -l
total 0
$
0
27.01.2020, 23:15

В ситуации, где я только должен очистить такие файлы как, я просто перечислил бы их в файл:

$ ls -1 > delete-list

Затем, вручную редактирование delete-list таким образом, это только содержит названия файлов, которые я хочу удалить. Наконец:

$ xargs --delim=\\n rm < delete-list

Если имена хорошего поведения относительно пробела, то можно отбросить параноика --delim опция.

0
27.01.2020, 23:15

Теги

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