Я сделал опечатку:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
Теперь у меня есть файл, который называется ^ C (Ctrl + C) !! Когда я использую, ls
я просто вижу вопросительный знак (вероятно, из-за локали?)
% ls -al
total 60
drwxr-xr-x 2 root wheel 512 Jan 21 09:35 ? <- this one
drwxr-xr-x 5 admin wheel 512 Jan 21 16:24 .
drwxr-xr-x 3 root wheel 512 Jan 20 14:29 ..
-rw-r--r-- 1 admin nobody 1114 Jan 20 19:10 .cshrc
-rw------- 1 admin wheel 6002 Jan 21 15:27 .history
-rw-r--r-- 1 admin nobody 182 Jan 20 14:29 .login
-rw-r--r-- 1 admin nobody 91 Jan 20 14:29 .login_conf
-rw------- 1 admin nobody 301 Jan 20 14:29 .mail_aliases
-rw-r--r-- 1 admin nobody 271 Jan 20 19:04 .mailrc
-rw-r--r-- 1 admin nobody 726 Jan 20 19:05 .profile
-rw------- 1 admin nobody 212 Jan 20 14:29 .rhosts
-rw-r--r-- 1 admin nobody 911 Jan 20 19:06 .shrc
drwx------ 2 admin nobody 512 Jan 20 15:05 .ssh
drwxr-xr-x 2 admin wheel 512 Jan 20 19:08 bin
а также
% ls -i
3611537 ? 3611534 bin
Я хочу удалить этот файл. Я пытаюсь mv
и при использовании табуляции завершается, он показывает мне:
% mv
^C/ bin/
Очевидно, я не могу набрать ^ C: - / Как мне удалить этот файл?
filesystems
freebsd
Mausy5043
источник
источник
dsw
не попал в POSIX.emacs -nw -f dired
дает каталог навигатора. <kbd> D </ kbd> удаляет файл под курсором после подтверждения.Ответы:
^V
( ctrl+ v) работает как своего рода escape-последовательность для следующего нажатия клавиши, вставляя связанное значение вместо выполнения любого действия, которое обычно связывается.Используя это,
^V^C
( ctrl+ v, ctrl+ c) должно работать для ввода вашего сложного имени файла в терминале.источник
^V^C
это не работает в редакторе ЗШ линии; Виджет для вставки в кавычки (ищите страницу^V
) явно не вставляет символы прерывания. Ответ Якоба (с использованием printf) может быть более переносимым способом предоставления управляющего символа в аргументе оболочки.Вы также можете удалить файл с помощью inode:
Что бы вы ни делали, ради бога, не ставят
-delete
перед тем-inum
:Поздравляю, вы просто уничтожили все свои файлы. С
find
, порядок аргументов имеет значение !источник
-delete
раньше-inum
? Это всего лишь мера предосторожности на случай, если вы нажмете ввод преждевременно, или порядок аргументов действительно влияет на результат?-delete
вводите в команду точку, пока вы не запустите команду без-delete
проверки того, что она находит то, что вы хотите.-print
вместо-delete
делает очень хороший тест.Другой вариант заключается в использовании
rm -ri ./*
;rm
спросит вас перед удалением любого файла и каталога, поэтому вам просто нужно ответитьy
на «плохой» файл иn
на все остальные.На самом деле, в вашем случае вы можете даже сократить количество необходимых ответов
rm -ri ./?
, поскольку ваш «плохой» файл имеет длину всего один символ.источник
select f in ?; do rm -i "$f"; break; done
имеет все преимущества-i
, без необходимости отвечатьno
на ведущие нежелательные сообщения или ошибочно отвечать «да» тому, кого вы хотите оставить.rmdir ?/
удалит все пустые односимвольные каталоги и будет жаловаться на то, что остальные не являются пустыми.select
существовало, довольно аккуратно!-r
(и./
- это всегда легко забыть) к своим примерам, поскольку, к сожалениюrmdir
,-i
флаг не поддерживается . Тем не менее, я полагаю, что в этом случае лучшим вариантом будет сочетание епископа и вашего комментария.select
существует только в некоторых оболочках, поэтому, вероятно, вы не сталкивались с этим - скрипты и решения, предназначенные для переносимости, избегают этого, поэтому мы с меньшей вероятностью увидим это «в дикой природе».Одним из вариантов является поиск имени файла с чем-то, кроме
ls
. Если вы знаете, что он был создан дословно Ctrl+ C, вы можете найти символ ASCII, созданный с использованием таблицы контрольных символов или с более дружественным интерфейсом, подобным предоставленному Python:Другим вариантом было бы посмотреть на шестнадцатеричный дамп вывода
ls
, используя , напримерhexdump
.Затем вы можете удалить файл с помощью (например) этой команды bash:
(Двойные кавычки нужны только в том случае, если символ, который вы пытаетесь вывести, находится в вашей
IFS
переменной, например,\x20
или\x0A
, но это хорошая привычка заключать в кавычки подстановки команд, если вы не знаете, что оболочка должна выполнять разбиение полей и т. Д.)источник
cat -v
(плюсman ascii
) может помочь первая часть.os.rmdir('\x03')
прямо из оболочки Python.Часто в таких ситуациях легко придумать шаблон подстановки, который соответствует соответствующему файлу.
В вашем случае это было бы просто
?
(сопоставление всех имен файлов точно с одним символом).Просто убедитесь, что это действительно соответствует тому, что вы хотите:
А затем удалите каталог:
Вы также можете комбинировать это с завершением вкладки . Вы можете напечатать
и нажмите Tab, и, например, в Bash он будет заменен на
и затем вы можете нажать Enter, и он сделает то, что вы хотите.
источник
Вы можете использовать Midnight Commander (mc) для удаления файла - просто выберите с помощью кнопок вверх / вниз и нажмите F8.
Я делал это иногда, когда имена файлов имели странные символы из-за кодировки.
источник
Еще один способ: использовать
stat
для получения экранированного представления имени каталога:Теперь вы знаете представление имени файла, поэтому вы можете удалить файл по имени, используя
printf
:Или, если вы используете Bash, вы можете избежать
printf
:источник
$'\x03'
это проще, чем вызывать printf. То же самое для FreeBSD sh, которая распространяется на оболочку POSIX с некоторыми вкусными функциями.$'...'
, но я бы вообще избежал бесполезного преобразования из восьмеричного в шестнадцатеричное. Например, что если файл был назван'\111'
(наstat
выходе)? Вы все еще удалили бы его, используя$'\x49'
? Лучше использовать ту же последовательность , какstat
дал вам: в случае с ФП, вrmdir $'\003'
.Решение, которое сработало для меня:
циклически перебирать доступные файлы, пока не найду тот, который хочу удалить.
Но вам нужно иметь необходимые настройки в вашей оболочке, чтобы это работало.
источник
Самый простой способ - переместить все во временный каталог, а затем
rm -r DIRNAME
.источник
^v
работал на меня целую вечность.^V
нужны определенные знания, а перемещение файлов и удаление родительского каталога могут быть получены из основ.Если это единственный пустой каталог (или вы не хотите удалять другие пустые каталоги), используйте
rmdir */
. Вы получите сообщения об ошибкахrmdir
о невозможности удаления непустых каталогов, но это нормально. GNUrmdir
поддерживает--ignore-fail-on-non-empty
, или вы могли бы2>/dev/null
.Трейлинг
/
заставляет глобус соответствовать только именам каталогов.Вы можете заранее проверить, какие пустые каталоги существуют в текущем, используя
find -maxdepth 1 -type d -empty -ls
. (И вы можете изменить ,-ls
чтобы ,-delete
если вы хотите).Вы можете использовать более конкретное выражение glob, например,
rmdir [^A-Za-z0-9._]/
для сопоставления каталогов, которые начинаются с не буквенно-цифрового или подчеркивания имени файла. Я также включил.
, но выражения glob.
обычно не совпадают в любом случае.Как уже отмечали другие, вы можете ограничить его односимвольными именами с помощью
?
:rmdir ?/
rmdir
У него нет-i
выбора, какrm
, например, потому что пустые каталоги обычно не имеют ценности и могут быть просто воссозданы.источник
rmdir
можете сказать вам, если вы передадите ему-v
опцию (по крайней мере, в GNU).find -maxdepth 1 -type d -empty -ls
Прежде чем делать что-то рискованное, попробуйте сначала:
В общем случае - это разделитель, указывающий на команду, за которой не будет следовать ни -o ptions, но он также позволит странным символам не интерпретироваться как что-то еще.
Другой пример использования
whois -r -- "-r OBJECT-RIPE"
(-r - это сокращение для спелых, но в спелых whois также параметр)
Если это не сработает с первого раза, то, возможно, попробуйте
rmdir -- "^C"
Но в моей оболочке csh мне это не нужно, просто
rmdir ^C
у меня уже работает.источник
rmdir
последующим <ctrl> C работает? В самом деле?! Я ожидаю, что он будет вести себя по-другому, а именно: отменаrmdir
команды и возврат вас в командную строку.