Как удалить файлы, начинающиеся с двойной дефис?
У меня есть некоторые файлы на моей машине 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