Как удалить файлы, начинающиеся с двойной дефис?

У меня есть некоторые файлы на моей машине Unix, которые начинаются с

 --

например. --testings.html

Если я попытаюсь удалить его, я получаю следующую ошибку:

cb0$ rm --testings.html
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
       unlink file

Я пробовал

rm "--testings.html" || rm '--testings.html' 

но ничего не работает.

Как удалить такие файлы на терминале?

Ответ 1

rm -- --testings.html

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

Это не относится к команде rm. Функция getopt реализует ее, и многие (все?) Команды в стиле UNIX относятся к ней одинаково: -- завершает обработку параметров и все, что является регулярным аргументом.

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

Ответ 2

rm -- --somefile

В то время как это работает, это решение, основанное на rm с использованием getopts для разбора его опций. Есть приложения, которые проводят свой собственный анализ и тоже будут терпеть неудачу (потому что они могут не обязательно реализовывать логику "-- означает конец опций" ).

Из-за этого решение, которое вы должны проехать через ваш череп, таково:

rm ./--somefile

Он всегда будет работать, потому что таким образом ваши аргументы никогда не начинаются с -.

Кроме того, если вы пытаетесь сделать действительно достойные сценарии оболочки; вы должны технически ставить ./ перед всеми вашими расширениями параметров имени файла, чтобы ваши скрипты не прерывались из-за фанкового ввода имени файла (или для предотвращения их злоупотребления/использования для выполнения действий, которые они не должны делать: например, rm удалит файлы, но пропустит каталоги, а rm -rf * удалит все. Передача имени файла "-rf" в script или кто-то touch ~victim/-rf 'может таким образом использоваться для изменения его поведения с очень плохими последствиями).

Ответ 3

Либо rm -- --testings.html, либо rm ./--testings.html.

Ответ 4

rm -- --testings.html

Ответ 5

Еще один способ сделать это - использовать find... -name "- *" -delete

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 

Ответ 6

Для более обобщенного подхода к удалению файлов с невозможными символами в имени файла один из вариантов - использовать индексный файл.

Его можно получить с помощью ls -i.

например.

$ ls -lai | grep -i test
452998712 -rw-r--r--  1 dim   dim      6 2009-05-22 21:50 --testings.html

И чтобы стереть его, с помощью find:

$ find ./ -inum 452998712 -exec rm \{\} \;

Этот процесс может быть полезен при работе с большим количеством файлов с особенностями имени файла, поскольку его можно легко создать сценарий.

Ответ 7

rm ./--testings.html

или

rm -- --testings.html