Как читать тире файлы


15

Как я могу прочитать файл тире из терминала, кроме разграничения его с помощью ./

Например, чтобы прочитать, - fileмы можем прочитать это

cat ./-file_name

В: Есть ли альтернативный способ добиться того же?


4
рекомендуемый способ - использовать ./префикс. Это самый портативный (см. Unix FAQ эры usenet)
Оливье Дюлак

find . -name "-filename" | xargs catотправит ./-filename через канал. В вашем (упрощенном?) Случае ошибка, но она может помочь в больших каталогах / скриптах.
Вальтер

Ответы:


11

Для команд, которые получают ввод от stdin, вы можете использовать перенаправление:

cat <-file_name

да, это работает :), поэтому у меня есть 3 способа прочитать их, один с помощью ./ другой с помощью - и другой с помощью <, еще способы сделать то же самое ??
Видхан

22

Используйте двойной, --чтобы отметить конец опций:

cat -- -<FILENAME>

Другие программы, такие как touch, rmили git checkoutтакже следуют этому соглашению:

$ touch -- -file
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:13 -file
$ echo hi! >> -file
$ cat -- -file
hi!
$ rm -- -file
$ echo $?
0

ВНИМАНИЕ: Рекомендуется всегда использовать --после rmв скриптах. Злоумышленник может поместить --rfфайл в каталог и rm *использовать его в качестве параметров запуска. Видеть это:

$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm *
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:21 -rf

К сожалению, это не то, что мы имели в виду, мы не хотели удалять каталоги. Мы должны были использовать --:

$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm -- *
rm: cannot remove `dir': Is a directory
$ ll
total 4.0K
drwxr-xr-x 2 ja ja 4.0K Mar 10 13:22 dir

3
Вы не можете рассчитывать на реализацию каждой программы --: многие делают, но не все.
Гленн Джекман

2
В самом деле? Я не сказал, что все программы реализованы --, я сказал, показал некоторые, которые делают.
Аркадиуш Драбчик

1
@ Видхан: я не знаю ни о каком другом варианте.
Аркадиуш Драбчик

1
@vidhan, вы также можете без всяких причин усложнить свою жизнь и сделать что-то подобное, find . -name '-file_name' -exec cat {} \;но в этом нет особого смысла.
Terdon

2
Это не работает, если файл назван -и ничего больше? Это появилось в wargame: overthewire.org/wargames/bandit/bandit2.html
ThisClark

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.