FreeBSD: Каталог під назвою ^ C (дійсно!) - як видалити?


127

Я зробив помилку на друку:

$ 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: - / Як я видалити цей файл?


11
Дуже погано, що DSW не перетворився на POSIX.
Марк Плотнік

12
@MarkPlotnick: занадто погано, що оригінал dsw не перетворив його на POSIX.
Маттео Італія

4
Я не думаю, що ви назвали це ctrl + C, ви назвали його по символу ascii, який відображається на цій комбінації клавіш, тобто ETX (ascii 3), ймовірно. Ваш шрифт консолі не має гліфів для цього символу, тому він використовує загальний гліф заміни "?".
jiggunjer

5
emacs -nw -f diredдає навігатор каталогів. <kbd> D </kbd> видаляє файл під курсором після підтвердження.
Thorbjørn Ravn Andersen

9
@MatteoItalia Це занадто погані керуючі символи у файлах файлів та інші ідіотичні ідеї перетворили його на POSIX ...
труба

Відповіді:


188

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

Використовуючи це, ^V^C( ctrl+ v, ctrl+ c) повинен працювати для введення вашого важкого імені файлу в термінал.


41
Напевно, таким чином ОП зробила друкарські помилки. V і C знаходяться прямо поруч із клавіатурою.
Стіг Хеммер

14
Або намагалися використовувати буфер обміну Windows на терміналі bsd.
Джоел Коел

2
@JoelCoel звички ніколи не вмирають!
Мафій

1
Цікаво, ^V^Cщо не працює в редакторі рядків Zsh; Лапки вставки віджета (пошук сторінки для ^V) явно не вставляє переривання символів. Відповідь Якоба (використовуючи printf) може бути більш портативним способом подання символу управління в аргументі оболонки.
Майлз

@StigHemmer: Що також може статися, це натиснути Ctrl-C посередині команди, потім забути про це і скопіювати команду пізніше.
Мехрдад

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, порядок аргументів має значення !


2
Чому не ставлять -deleteраніше -inum? Це лише обережність у випадку, якщо ви натиснете кнопку Enter передчасно або порядок аргументів насправді впливає на результат?
дебют

10
@detuur: порядок впливає на результат. Див. Редагування.
єпископ

37
Не вводьте -deleteв команду, періодично, поки ви не запустите команду, не -deleteперевіряючи, чи знаходить вона те, що ви хочете.
Каз

2
@Kaz не дуже допоможе при додаванні -delete в командному центрі
RiaD

9
@Kaz використання -printзамість -deleteробить дуже хороший тест.
Марк Рансом

32

Інший варіант - використання rm -ri ./*; rmзапитає вас перед тим, як видалити будь-який файл і каталог, тому вам просто потрібно відповісти yна "поганий" файл і nна всі інші.

Насправді, у вашому випадку ви навіть можете зменшити кількість відповідей, необхідних для цього rm -ri ./?, оскільки ваш "поганий" файл має лише один символ.


8
select f in ?; do rm -i "$f"; break; doneмає всі переваги -i, без агонії на те, щоб відповідати noна провідні непотрібні або помилково відповісти "так" тому, кого ви хочете зберегти.
єпископ

6
У випадку з ОП це каталог, а не файл. rmdir ?/видалить усі порожні односимвольні каталоги та поскаржиться на те, що інші не порожні.
Пітер Кордес

2
@bishop: хто, я навіть не знав, що selectіснує, досить акуратно!
Маттео Італія

@PeterCordes: wops, я не помітив, що ми говоримо про каталоги; Я додав -r./- це завжди легко забути) до своїх прикладів, оскільки, на жаль rmdir, не підтримує -iпрапор. Але я припускаю, що в цьому випадку найкращим способом було б поєднання єпископа та вашого коментаря.
Маттео Італія

1
@MatteoItalia selectіснує лише в деяких оболонках, тому, ймовірно, ви не натрапили на неї - сценарії та рішення, які повинні бути портативними, уникають цього, тому ми рідше бачимо це "в дикій природі".
mtraceur

23

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

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

Іншим варіантом було б подивитися на шістнадцятковий дамп виводу ls, використовуючи напр hexdump.

Потім ви можете видалити файл за допомогою (наприклад) цієї команди bash:

rmdir "$(printf '\x03')"

(Подвійні лапки потрібні лише в тому випадку, якщо символ, який ви намагаєтеся надрукувати, є у вашій IFSзмінній, наприклад, \x20або \x0A, але це корисна звичка цитувати підстановки команд, якщо ви не знаєте, що хочете, щоб оболонка виконувала розбиття поля тощо).


2
Також cat -v(плюс man ascii) може допомогти для першої частини.
Маттео Італія

13
... або ви використовуєте os.rmdir('\x03')безпосередньо з оболонки Python.
moooeeeep

15

Часто в таких ситуаціях легко придумати схему підстановки, яка відповідає відповідному файлу.

У вашому випадку це було б просто ?(збіг усіх імен файлів точно з одним символом).

Просто переконайтеся, що він відповідає дійсному бажаному:

ls -ld ?

А потім видаліть каталог:

rmdir ?

Ви також можете поєднати це із заповненням вкладки . Ви можете набрати

rmdir ?

і натисніть вкладку, і, наприклад, в bash його буде замінено на

rmdir ^C/

і ви можете натиснути клавішу Enter, і вона робить все, що ви хочете.


11

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

Я робив це час від часу, коли імена файлів мали дивні символи через кодування.


4
Або майже про будь-який інший файловий менеджер.
Stig Hemmer

@StigHemmer Звичайно, деякі роблять краще, ніж інші, для відображення певних імен файлів. Можливо, відповідь могла б пояснити, чому MC є оптимальним вибором порівняно з кількома вибраними іншими. Я б не знав, як ніколи не користувався цим.
can-ned_food

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’

BTW, якщо оболонка є bash, $'\x03'простіше, ніж викликати printf. Те ж саме для FreeBSD sh, який розширюється на оболонці POSIX з деякими смачними особливостями.
Netch

@Netch хороший пункт про bash's $'...', але я б уникав марного перетворення з восьмеричного в шістнадцятковий в цілому. Наприклад, що якщо файл був названий '\111'statвисновку)? Ви все-таки видалите його за допомогою $'\x49'? Краще використовувати ту ж послідовність , як statдав вам: у випадку з ФП, в rmdir $'\003'.
Руслан

6

Рішення, яке для мене спрацювало:

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

перебирати наявні файли, поки я не знайду потрібного.

Але для роботи вам потрібно мати необхідні налаштування в оболонці.


^ С насправді рано в послідовності вкладок, тому +1 для вас.
Джошудсон

5

Найпростіший спосіб - перемістити все у тимчасовий каталог, а потім rm -r DIRNAME.


7
Вам справді здається легше, ніж прийнята відповідь?
пташенята

2
@chicks: Це насправді не така погана відповідь. Я бачив ^ V ^ C не працює, щоб хтось застряг.
Джошудсон

Сам по собі це неправильно, але, схоже, багато додаткової роботи порівняно з більш прямими рішеннями. Можливо, я зіпсований Linux, але ^vпостійно працював на мене протягом століть.
пташенята

6
@chicks ^Vпотребують конкретних знань, коли переміщення файлів і видалення батьківського каталогу можна отримати з основ.
Кондібас

5
Ctrl + V небезпечно амбітний, залежно від вашого конкретного робочого середовища ... деякі термінальні емулятори можуть інтерпретувати це як пасту. Якщо ваш буфер вставки містить назву того, що ви не хочете видалити, - і новий рядок, ви можете розглянути проблему.
rackandboneman

1

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

За допомогою трейлінгу /назви каталогів відповідають лише глобальним іменам.

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

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


Як зазначали інші, ви можете обмежити це одноіменними іменами із глобусом ?: rmdir ?/

rmdirне має -iможливості, як rmце робиться, імовірно, тому що порожні каталоги зазвичай не є цінними і їх можна просто відтворити.


1
Ви хочете дізнатись, які каталоги ви хочете відтворити, і rmdirможуть повідомити, чи передаєте вам -vваріант (принаймні в GNU).
Руслан

@Ruslan: Якщо б у вас не було інших несвіжих каталогів, про які ви більше не піклувалися, і видалення їх було б бонусом. Ви можете шукати порожні каталоги зfind -maxdepth 1 -type d -empty -ls
Пітер Кордес

-1

Перш ніж робити щось ризиковане, спробуйте спочатку:

rmdir -- ^C

Взагалі - це роздільник, який повідомляє команду no -o ptions, але це також дозволить не сприймати дивні символи як щось інше.

Іншим прикладом використання є whois -r -- "-r OBJECT-RIPE"

(-r - це ярлик для стиглої, але в стиглому - це також параметр)

Якщо спочатку не виходить, то, можливо, спробуйте rmdir -- "^C"

Але в моїй оболонці csh мені цього не потрібно, просто rmdir ^Cвже працює для мене.


1
У csh-типі з rmdir наступним <ctrl> C працює? Дійсно ?! Я б очікував, що він поводиться інакше, а саме - перервав rmdirкоманду і повернув вас до командного рядка.
Mausy5043

Це дійсно буде. Дивіться прийняту відповідь про те, як ввести символ ^ C у командному рядку.
Але
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.