У меня есть некоторые файлы на моей машине Unix, которые начинаются с
--
eg --testings.html
Если я попытаюсь удалить его, я получаю следующую ошибку:
cb0$ rm --testings.html rm: illegal option -- - usage: rm [-f | -i] [-dPRrvW] file ... unlink file
Я пытался
rm "--testings.html" || rm '--testings.html'
но ничего не работает.
Как удалить такие файлы на терминал?
rm -- --testings.html
Параметр --
указывает rm обрабатывать все дальнейшие аргументы как имена файлов, а не как параметры, даже если они начинаются с -
.
Это не относится к команде rm. Функция getopt реализует его, и многие (все?) Команды в стиле UNIX относятся к нему одинаково: --
завершает обработку опций и все, что является регулярным аргументом.
http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt
rm -- --somefile
Хотя это работает, это решение, основанное на rm
с использованием getopts для parsingа его параметров. Есть приложения, которые проводят свой собственный анализ и тоже будут терпеть неудачу (потому что они могут не обязательно реализовывать логику « --
конец конца опций»).
Из-за этого решение, которое вы должны проехать через ваш череп, таково:
rm ./--somefile
Он всегда будет работать, потому что таким образом ваши аргументы никогда не начинаются с.
Более того, если вы пытаетесь сделать действительно приличные сценарии оболочки; вы должны технически ставить ./
перед всеми расширениями параметров вашего имени файла, чтобы ваши скрипты не прерывались из-за фанкового ввода имени файла (или для предотвращения их злоупотребления / использования для выполнения действий, которые они не должны делать: например, rm
удалит файлы, но пропустит каталоги, в то время как rm -rf *
удалит все. Передача имени файла -rf
скрипту или кому-либо touch ~victim/-rf
‘ing может таким образом использоваться для изменения его поведения с помощью плохие последствия).
Либо rm -- --testings.html
либо rm ./--testings.html
.
rm -- --testings.html
Еще один способ сделать это – использовать find … -name “- *” -delete
touch -- --file find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete
Для более обобщенного подхода к удалению файлов с невозможными символами в имени файла, один из вариантов заключается в использовании inode файла.
Его можно получить через ls -i
.
например
$ ls -lai | grep -i test 452998712 -rw-r--r-- 1 dim dim 6 2009-05-22 21:50 --testings.html
И стереть его, с помощью поиска:
$ find ./ -inum 452998712 -exec rm \{\} \;
Этот процесс может быть полезен при работе с большим количеством файлов с особенностями имени файла, поскольку его можно легко создавать сценарии.
rm ./--testings.html
или
rm -- --testings.html