it-swarm.com.ru

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

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

 --

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

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

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

Я старался

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

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

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

66
cb0
rm -- --testings.html

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

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

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

141
Steve Jessop
rm -- --somefile

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

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

rm ./--somefile

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

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

55
lhunath

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

17
Vatine
rm -- --testings.html
7
Juliano

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

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

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

Его можно получить через 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 \{\} \;

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

3
Dimitris
rm ./--testings.html

или же

rm -- --testings.html
1
Paul Smith