FreeBSD: Каталог называется ^ C (действительно!) - как удалить?

Я сделал опечатку:

 $ 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/
 

Очевидно, я не могу набрать a ^ C: - / Как удалить этот файл?

127 голосов | спросил Mausy5043 21 Jpm1000000pmSun, 21 Jan 2018 18:55:11 +030018 2018, 18:55:11

11 ответов


188

^V ( ctrl + v ) работает как своего рода escape-последовательность для следующего нажатия клавиши, вместо этого вставляя связанное значение принятия любых действий, которые обычно связываются.

Используя это, ^V^C ( ctrl + v , ctrl + c ) должен работать для ввода вашего сложного имени файла в терминале.

ответил Håkan Lindqvist 21 Jpm1000000pmSun, 21 Jan 2018 19:23:05 +030018 2018, 19:23:05
89

Вы также можете удалить файл inode:

 $ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete
 

Что бы вы ни делали, ради Бога, не ставьте -delete перед -inum:

 $ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$ 
 

Поздравляем, вы просто уничтожили все ваши файлы. С find, аргумент имеет значение !

ответил bishop 22 Jam1000000amMon, 22 Jan 2018 06:42:25 +030018 2018, 06:42:25
31

Другой вариант - использовать rm -ri ./*; rm спросит вас перед удалением любого файла и каталога, поэтому вам просто нужно ответить y на «плохой» файл и n на все другие.

На самом деле, в вашем случае вы можете даже сократить количество ответов, необходимых для выполнения кода rm -ri ./?, так как ваш «плохой» файл имеет длину всего один символ.

ответил Matteo Italia 21 Jpm1000000pmSun, 21 Jan 2018 23:13:01 +030018 2018, 23:13:01
23

Один из вариантов - найти имя файла с помощью чего-то другого, кроме ls. Если вы знаете, что он был создан с помощью стенограммы Ctrl + C , вы можете найти символ ASCII, созданный с помощью таблица символов управления или с более дружественным интерфейсом, подобным тому, который предоставляется Python:

 >>> import os
>>> os.listdir('.')
['\x03', ...]
 

Другой вариант - посмотреть шестнадцатеричный дамп вывода ls, используя, например, hexdump .

Затем вы можете удалить файл с помощью (например) этой команды bash:

 rmdir "$(printf '\x03')"
 

(Двойные кавычки нужны только в том случае, если символ, который вы пытаетесь распечатать, находится в переменной IFS, такой как \x20 или \x0A, но это хорошая привычка указывать замену команд, если вы не знаете, что вы хотите, чтобы оболочка выполняла разделение поля и т. д.)

ответил Jakob 21 Jpm1000000pmSun, 21 Jan 2018 21:51:39 +030018 2018, 21:51:39
15

Часто в подобных ситуациях легко найти шаблон шаблона , который соответствует соответствующему файлу.

В вашем случае это будет просто ? (сопоставление всех имен файлов с одним символом).

Просто убедитесь, что он действительно соответствует тому, что вы хотите:

 ls -ld ?
 

И затем удалите каталог:

 rmdir ?
 

Вы также можете комбинировать это с завершением вкладки . Вы можете ввести

 rmdir ?
 

и нажмите вкладку и, например, в bash он будет заменен на

 rmdir ^C/
 

, и вы можете нажать «Ввод», и он делает то, что вы хотите.

ответил Jukka Suomela 22 Jam1000000amMon, 22 Jan 2018 00:02:53 +030018 2018, 00:02:53
11

Вы можете использовать Midnight Commander (mc) для удаления файла - просто выберите с помощью кнопок вверх /вниз и нажмите F8.

Я делал это иногда, когда имена файлов имели странные символы из-за кодирования.

ответил filo 21 Jpm1000000pmSun, 21 Jan 2018 23:29:57 +030018 2018, 23:29:57
7

Еще один способ: используйте stat, чтобы получить экранированное представление имени каталога:

 $ stat *|grep File:
  File: ‘\003’
 

Теперь вы знаете представление имени файла, поэтому вы можете удалить файл по имени, используя printf:

 $ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’
 

Или, если вы используете bash, вы можете избежать printf:

 $ rmdir -v $'\003'
rmdir: removing directory, ‘\003’
 
ответил Ruslan 22 Jpm1000000pmMon, 22 Jan 2018 13:25:08 +030018 2018, 13:25:08
6

Решение, которое сработало для меня, это:

 rm ./[Tab][Tab][Tab]...
 

, чтобы просмотреть доступные файлы, пока не найду тот, который я хочу удалить.

Но вам нужно иметь необходимые настройки в вашей оболочке для работы.

ответил joeytwiddle 22 Jam1000000amMon, 22 Jan 2018 11:31:51 +030018 2018, 11:31:51
5

Самый простой способ - переместить все во временный каталог, а затем rm -r DIRNAME.

ответил Kondybas 21 Jpm1000000pmSun, 21 Jan 2018 19:31:50 +030018 2018, 19:31:50
1

Если это единственный пустой каталог (или вы не хотите удалять другие пустые каталоги), используйте rmdir */ . Вы получите сообщения об ошибках из rmdir о невозможности удалить непустые каталоги, но это нормально. GNU rmdir поддерживает --ignore-fail-on-non-empty, или вы можете 2>/dev/null.

Конечный / делает glob только соответствия именам каталогов.

Вы можете заранее проверить, какие пустые каталоги существуют под текущим, используя find -maxdepth 1 -type d -empty -ls. (И вы можете изменить -ls на -delete, если хотите).

Вы можете использовать более конкретное выражение glob, например rmdir [^A-Za-z0-9._]/, чтобы сопоставить каталоги, начинающиеся с не-буквенно-цифрового или подчёркивающего имени файла. Я также включил ., но выражения glob не совпадают с . в любом случае.


Как указывали другие, вы можете ограничить его односимвольными именами с помощью glob ?: rmdir ?/

rmdir не имеет опции -i, путь rm, предположительно потому, что пустые каталоги обычно не ценны и могут быть просто воссоздан.

ответил Peter Cordes 22 Jam1000000amMon, 22 Jan 2018 08:39:44 +030018 2018, 08:39:44
0

Прежде чем делать что-нибудь рискованное, попробуйте сначала:

 rmdir -- ^C
 

В общем случае - это разделитель, указывающий команде no -o ptions, но это также позволит нечетким символам интерпретировать что-то еще.

Другим примером использования является whois -r -- "-r OBJECT-RIPE"

(- r - ярлык для спелых, но в зрелом whois также параметр)

Если сначала не попробовать, попробуйте rmdir -- "^C"

Но в моей оболочке csh мне это не нужно, просто rmdir ^C уже работает для меня.

ответил Leo Vandew. 22 Jpm1000000pmMon, 22 Jan 2018 23:12:25 +030018 2018, 23:12:25

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132