Как я удаляю файл, имя которого начинается “-” (дефис иначе подчеркивают штриховой линией или минус)?

Для удаления строки под курсором использовать dd.

Удалить команда принимает все нормальные позиционные модификаторы, поэтому если Вы находитесь в начале строки ниже той, Вы хотите удалить, Вы могли просто dk для входа удаляют режим и перемещают одну строку вверх, удаляя все, что курсор передал.

Можно также указать повторение, таким образом, 5dd удалит строку под курсором пять раз, эффективно удаляя ток и после четырех строк.

363
14.01.2012, 02:44
10 ответов

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

rm -- --help
528
27.01.2020, 19:28
  • 1
    я знал это, был чем-то очень простым как это... –  Bryan Rehbein 02.09.2010, 22:37
  • 2
    Сделайте все версии rm управляйте поддерживают -- аргумент? –  Keith Thompson 06.12.2011, 09:18
  • 3
    @KeithThompson - функция большинства инструментов GNU, таким образом, она не будет работать над большей частью не-GNU ("не-Linux") Unix'es (например, варианты BSD или некоторые встроенные системы) –  dtech 06.04.2013, 20:00
  • 4
    СПАСИБО!, Которая сохранила мой день. И конечно это работает над BSD (OSX) и с другими командами! –  raskhadafi 02.12.2013, 10:46
  • 5
    @dtech, getopt () и -- предшествуйте GNU (SysIII, 1980), и стандарт/POSIX. Стандартные утилиты за исключением нескольких исключений (как echo) понять --. YMMV для других команд, если они не используют getopt () API для парсинга опций. –  Stéphane Chazelas 17.06.2015, 15:08

Или можно сделать

rm ./--help
224
27.01.2020, 19:28
  • 1
    Это - то, которое я помню. Используя "комнату - справка" является чем-то, что я всегда должен искать. –  user603 21.09.2010, 07:12
  • 2
    Этот метод всегда работает даже на команды, которые не рассматривают -- особенно. –  jw013 26.12.2011, 23:47
  • 3
    И это также работает для предотвращения специального режима некоторыми командами для других типов (около опций) параметров специально, передаваемых по имени как - из текстовых утилит или cd, foo=bar из awk... –  Stéphane Chazelas 17.06.2015, 13:31
  • 4
    Это работает, когда файл начинается с единственного тире, где rm -- <filename> не сделал. –  StockB 31.10.2017, 16:31

Ответы Vegar Nilsen и edfuh очень хороши и надлежащие решения проблемы как это.

Я действительно хочу добавить общий ответ на этот вопрос, который позволяет Вам удалять любой файл с трудным именем файла. Сначала его inode число получено с помощью ls -i или некоторая форма stat и затем файл удален путем поиска файлов в текущем каталоге inode числом и выполнения rm команда на файле с соответствием inode число

find . -inode <inode> -exec rm {}\;

С тех пор inode числа уникальны в каждой файловой системе, можно удалить любой файл с помощью этого; unicode или использующий символы ESC. Это - как когда-либо очень раздражающий для вывода так я рекомендовал бы добавить строку

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

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

21
27.01.2020, 19:28
  • 1
    Этот путь имеет две проблемы: 1) не используйте - исполнительная комната, когда можно использовать - удаляют; 2) получение inode и использование, которое является напрасно сверхсложным, когда можно просто использовать: find -name '--help' -delete –  aculich 06.12.2011, 03:36
  • 2
    я не думаю, что это будет работать. Это пересекает все файлы в текущем каталоге и все его подкаталоги, и в конце концов что это все еще вызывает rm --help, который все еще не удалит файл. Просто используйте rm ./--help (или rm -i *. –  Keith Thompson 06.12.2011, 09:16
  • 3
    @KeithThompson find префиксы путь параметра командной строки ко всем файлам, таким образом, это работало бы rm ./--help и rm ./sub/dirs/--help. Для фиксации второго нужно было бы добавить -maxdepth 1, но все это по существу применяет решение @edfuh более окольным, замысловатым способом, и -delete более безопасно, чем -exec rm так или иначе. –  jw013 26.12.2011, 23:39
  • 4
    Еще одна проблема с этой командой - то, что должно быть пространство между {} и \;, иначе это не будет работать. –  Eugene S 22.05.2012, 17:08
  • 5
    inodes может быть уникальным, но может быть несколько записей каталога с тем же inode. Их называют hardlinks. И они только уникальны на файловую систему, таким образом, необходимо было бы использовать -xdev. Это не поможет Вам выполнить это ls -i --help. –  Stéphane Chazelas 17.06.2015, 15:16

Использовать find сделать это:

find . -name '--help' -delete

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

На самом деле, Вы предотвращение rm в пользу find (особенно с предварительным просмотром сначала), хорошая привычка, которая поможет Вам избежать ошибок с rm * это неизбежно укусит Вас однажды.

Обратите внимание, тем не менее, что находка рекурсивно вызовет через все Ваши подкаталоги, таким образом, Вы могли бы хотеть выполнить ее с ограничением глубины подкаталога как это:

find . -maxdepth 1 -name '--help' -delete

который ограничивает находку текущим каталогом.

37
27.01.2020, 19:28
  • 1
    Портативно, необходимо дать find список файлов/директоров для изучения. Так find . -name.... -delete и -maxdepth не стандартные опции также. –  Stéphane Chazelas 17.06.2015, 15:17

Полуночный командующий (mc) является самым легким, просто укажите на него и поразите F8 ;)

2
27.01.2020, 19:28
  • 1
    OP хочет командную строку (CLI) решение. –  Francesco Turco 14.09.2012, 16:11
  • 2
    ЯВЛЯЕТСЯ решением CLI. Просто используйте свою кормушку пакета для установки его. (Это даже работает по ssh...), en.wikipedia.org/wiki/Midnight_Commander –  daviewales 20.09.2013, 03:41
  • 3
    Как apt-get install mc || yum install mc; mc различные клавиши со стрелками и F8 легче, чем rm ./--help? –  Josh 11.12.2014, 18:33
  • 4
    @daviewales: Полуночный Командующий запускается с командной строки, и она работает в терминале, но все действия клавиатуры в Полуночном Командующем не от CLI (Интерфейс командной строки) - они - с Полуночи Интерфейс Командующего. - Как правило, утилиты командной строки могут быть выполнены в рамках сценария (исключением является история командной строки удара), –  Peter.O 18.08.2015, 00:33

Если Вы хотите переименовать файл, -.bar, (mv не будет работать), попробуйте это:

cat >foo.bar <-.bar

перед использованием команды:

rm -- -.bar

Необходимо смочь исследовать содержание исходного файла в foo.bar

-3
27.01.2020, 19:28
  • 1
    Создание копии файла не является очень эффективным решением для переименования его. –  jw013 26.12.2011, 23:42
  • 2
    Вы могли использовать vidir; но это, вероятно, так же, как (или еще больше) неэффективно - и намного более опасный. –  Stephen Menasian 27.12.2011, 02:22

Жестокое решение:

perl -e "unlink '--help' or die 'Could not unlink.';"

perl -e "rmdir '-d' or die 'Could not rmdir.';"
11
27.01.2020, 19:28

Linux Пошаговое руководство по созданию файла с дефисами и пробелами, а затем его удалению .

БУДЬТЕ ОСТОРОЖНЫ! Не запускайте случайно команду rm -rf / или аналогичную команду каскадного удаления.

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

Создайте файл с именем "--yo yo"

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

Сначала найдите его с помощью find:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

Убедитесь, что команда find находит ТОЛЬКО ОДИН файл, который вы хотите удалить:

Затем передайте параметр -delete найти, удалить их:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

Аааа и его больше нет.

8
27.01.2020, 19:28

вот решение, которое я использовал до того, как нашел эту тему.
используйте vim для "редактирования" каталога:

vim .

затем (в vim) выберите ваш файл, нажмите del и подтвердите удаление.

когда вы закончите, выйдите из vim с помощью :q

1
20.08.2021, 13:40

Вы пытались добавить имя каталога в качестве префикса:

$ rm./-filename.txt dirname/-filename2.txt
$ mv./-filename.txt filename.txt
$ cp teste./-teste

Использование каталога в качестве префикса файла в целом помогает избежать неправильной интерпретации символа «минус» как опции команды функцией парсера.

-1
20.08.2021, 13:40

Теги

Похожие вопросы