Мне каким-то образом удалось создать файл, который, кажется, не имеет имени файла. Я нашел некоторую информацию о том, как получить более подробную информацию о файле в следующей теме.
Тем не менее, я попробовал некоторые из перечисленных предложений и не могу удалить файл. Я не уверен, что я сделал, чтобы создать его, но это произошло при попытке скопировать XML-файл.
Некоторая информация о файле выглядит следующим образом;
> ls -lb
total 296
-rw-r--r-- 1 voyager endeavor 137627 Jan 12 12:49 \177
> file *
: XML document
> ls -i
417777
Я попытался найти с помощью переключателя inum, а затем передать его rm, так как это казалось самым надежным способом избавиться от него. Тем не менее, пример, приведенный в нижней части темы, связанной ниже, потерпел неудачу для меня. Пример был:
> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
поэтому я сначала попытался использовать список путей, как показано ниже, но это тоже не сработало:
> find . -inum 41777 -exec ls -al {} \;
Я не уверен, что такое непечатаемый символ \ 177 или как я могу передать его rm
команде, но я действительно хочу убедиться, что я не испортил другие файлы / каталоги при попытке удалить этот файл.
источник
\177
являетсяDEL
символом ASCII .0
?Ответы:
Файл имеет имя, но состоит из непечатаемых символов. Если вы используете ksh93, bash, zsh, mksh или FreeBSD sh, вы можете попытаться удалить его, указав его непечатаемое имя. Сначала убедитесь, что имя верно с:
ls -ld $'\177'
Если оно показывает правильный файл, затем используйте rm:rm $'\177'
Другой (немного более рискованный) подход заключается в использовании
rm -i -- *
. С опцией -i rm требует подтверждения перед удалением файла, поэтому вы можете пропустить все файлы, которые хотите сохранить, кроме одного.Удачи!
источник
rm -i *
это не сработало бы в этом случае; из-за перевода строки оболочка будет расширяться*
до того,rm
что не будет распознаваться как имя файла.bash
и GNUrm
. В моей системеrm *
,rm -i *
иrm Ctrl-V DEL TAB ENTER
все работают правильно, даже если имя файла содержит символ новой строки (я"\177foo\nbar\n"
). Некоторые команды плохо обрабатывают такие имена файлов, но инструменты GNU кажутся надежными; не-GNU версии тех же инструментов могут не работать. В любом случае, различные уловки в этих ответах полезно знать.rm
никогда не будет разбивать слова на части, будь то GNUrm
или нет. Оболочка расширяет глобусы и, когда она выполняет вызванную команду, передает полученные имена файлов как аргументы, разделенные нулями (в коде C). Что опасно, так это передать список файлов чему-то, что использует в качестве разделителей символы новой строки ; см. Почему циклическая обработка вывода find является плохой практикой?Для тех, кто использует,
vim
запустите его в текущем рабочем каталоге:и перейдите к файлу с помощью клавиш со стрелками или
j/k
. Затем нажмитеShift+D
и подтвердите удаление нажатиемy
.источник
Возможно, есть способ передать имя файла
rm
, но если вы беспокоитесь о том, чтобы что-то испортить, вы можете использовать файловый менеджер с графическим интерфейсом. Emacs поставляется с режимом редактирования каталогов, который вы можете использовать, если он у вас установлен:Откройте папку в
emacs
. Вы можете запуститьemacs /path/to/folder
или открыть emacs, нажать Esc+ xи запуститьdired
, что запросит путьhttp://so.mrozekma.com/unix-dired-delete1.png
Переместитесь в строку с файлом, который хотите удалить, и нажмите d. Вы должны увидеть
D
слева поле рядом с файлом:http://so.mrozekma.com/unix-dired-delete2.png
Нажмите, xчтобы сохранить изменения. Будет предложено убедиться, что вы хотите удалить файл; нажмите y:
http://so.mrozekma.com/unix-dired-delete3.png
источник
vim
запустите его в текущем рабочем каталоге:vim ./
и перейдите к файлу с помощью клавиш со стрелками. Затем нажмитеShift+D
и подтвердите удаление нажатиемy
.vim
поддержатьВы уже продемонстрировали,
file *
что shell glob (*
) может подобрать этот файл, так что теперь просто сделайте сrm
этим glob.rm -i *
n
для всех файлов, кроме одного с, казалось бы, невидимым именем файлаисточник
Файл на самом деле имеет имя, но он состоит из непечатаемых символов.
Простой способ - полагаться на завершение оболочки: нажимайте Tabнесколько раз, пока не будет вставлено «странное» имя файла. Ваша оболочка должна быть настроена на цикл между возможными завершениями:
menu-complete
, который не связан по умолчанию, а неcomplete
, который связан Tabпо умолчанию. Или используйте Esc *для вставки дополнений для всех файлов и удалите те, которые вы не хотите удалять, из командной строки.setopt auto_menu
илиsetopt menu_complete
установить.Если завершение не помогает в вашей оболочке, вы можете позвонить
rm -i -- *
и ответить «нет», за исключением этого конкретного файла. Если имя файла не начинается с печатного символа, вы можете ограничить совпадения файлами, первый символ которых не входит в набор печатных символов:(Будьте осторожны, если ваш шаблон может соответствовать файлу с именем
-f
, которыйrm
будет рассматриваться как вариант.)Другой метод заключается в вызове,
ls -i
чтобы найти индекс файла (индекс уникально идентифицирует файл в данной файловой системе), а затемfind -inum
работать с этим конкретным файлом. Этот метод в основном полезен, когда каталог содержит много файлов.Если у вас
find
нет-delete
выбора, позвонитеrm
:(Да, я знаю, что большая часть этого уже была опубликована. Но ответы с соответствующей информацией усложняют ситуацию.)
источник
Попробуйте использовать,
echo -e
чтобы получить персонажа\177
, а затемxargs
передать егоrm
.Выключаетecho
не принимает десятичные побеги, так обращенного в шестнадцатеричном:177
восьмеричный;echo
требует\0
(буквальный, а не нулевой байт) перед:источник
\xb1
является десятичным177
,\0
завершает его нулем и-0
говоритxargs
брать имя с нулевым символом в конце вместо символа с новой строкой.echo
, как есть, отправляете 2 имени файла в xargs, а затем вrm
... второе имя файла\n
... Это приводит к ошибке или удалению файла с таким именем ('\ n')-n
чтобы избавиться от новой строки.Я могу только о гарантии, что файл действительно есть имя. Это просто имя, которое содержит непечатные символы.
Если
rm
это не сработало, то использование выводаfind
с-inum
параметром в качестве аргументаrm
вряд ли поможет; он просто передаст тот же аргументrm
, с той же проблемой.Файл единственный в этом каталоге, верно?
Первое, что я попробую, - это
cd
зайти в каталог, затем набратьrm ./
, а затем нажать клавишу Tab. Это должно расширить аргумент до фактического имени файла, а предшествующее./
должно препятствоватьrm
интерпретации аргумента как чего-то отличного от имени файла.Другое решение заключается в том, чтобы
cd
перейти в родительский каталог, а затем использоватьrm -r
(или, если необходимо,rm -rf
) каталог. Это должно удалить каталог и все его содержимое, независимо от имени. Затем вы можете использовать,mkdir
чтобы воссоздать каталог (и, возможно,chmod
восстановить его разрешения).РЕДАКТИРОВАТЬ :
Глядя на ваш
ls -lb
вывод еще раз, я думаю, что имя файла начинается с символа ASCIIDEL
(что плохо, но не фатально) и содержит один или несколько символов новой строки (что действительно плохо). Насколько я могу судить,rm
команда не может интерпретировать символ новой строки как часть имени файла.Но
unlink()
системный вызов может. Вот сценарий Perl, который я создал вместе, который будет перебирать файлы в текущем каталоге и спрашивать вас, хотите ли вы удалить его. Он не использует внешнюю команду, например,rm
для удаления файлов, поэтому он должен иметь возможность обрабатывать любые забавные символы, которые поддерживает файловая система (что угодно, кроме ASCIINUL
и/
).Делать
rm -r
илиrm -rf
на содержащем каталог должен продолжать работать, но если вы просто хотите , чтобы удалить один файл , вы можете попробовать это.(Другое решение, если в каталоге есть другие файлы, которые вы хотите сохранить, состоит в том, чтобы переместить все остальные файлы во временный каталог, затем разорвать и заново создать каталог и переместить другие файлы обратно.)
(О, и что бы вы ни делали, чтобы создать этот файл, попробуйте не делать это снова!)
источник
Если вы можете найти именно этот файл с помощью
find
команды, то вы можете использовать-delete
предикат. Просто будьте осторожны и сделайте-delete
последний параметр команды find, иначе это сильно повредит ...источник
Вы находитесь рядом. Пошагово, вот как удалить файл по номеру инода.
Сначала найдите номер инода нужного вам файла, используя
ls -li
. Номер инода будет в первом столбце вывода.Например:
В этом случае номер индекса равен 311010
Используйте
find
для поиска файла по номеру инода.Убедитесь, что
find
возвращается только имя файла, который вы хотите удалить. Например:Если вы уверены, что
find
нашли нужный файл, передайте-delete
параметр вfind
. Это удалит файл для вас.источник
Другие ответы великолепны и будут работать практически во всех средах.
Но, если у вас запущен графический интерфейс, просто откройте каталог в nautilus, dolphin, konqueror или в вашем любимом файловом менеджере, и вы сможете легко увидеть и удалить любой файл с неработающим именем с помощью пары щелчков мыши. ,
Если вы не обычный пользователь emacs или vim (как показано в нескольких других ответах), это может быть самый простой способ.
источник
Была похожая проблема с файлом с именем «\ 033» (фактический символ «Escape»).
Выше будет предложено удалить файлы в текущем каталоге, которые не начинаются с буквы или цифры.
источник
Вместо этого вы можете переименовать текущий каталог в
DirX_OLD
, создать новый каталог с именемDirX
и переместить все необходимые файлы изDirX_OLD
вDirX
. После копирования файлов вы можете удалитьDirX_OLD
источник
На всякий случай, если это кому-нибудь поможет, я прибавлю свои два цента. Мне удалось получить имена файлов, используя
stat
подстановочный знак, как это:Выход:
Тогда я мог бы использовать строки ANSI C-кавычки (как в принятом ответе) для доступа к файлам:
источник
У каждого файла есть имя, вам просто нужно найти, какое именно.
Я буду использовать эти файлы в качестве примеров:
Эти файлы будут отображаться как
?
обычноls
:Но если вы
ls
разрешите-Q
опцию, должно быть ясно, каково настоящее имя файла:это номера инодов и имена в кавычках в
1
столбце файлов в pwd.Это означает использование оболочки (POSIX) для использования расширений (globbing):
Чтобы иметь имена с любым непечатным символом:
И перечислить файлы, которые могут иметь только непечатаемые символы:
Затем, чтобы выборочно (
-i
(интерактивная) опция) удалить их, используйте:Вам просто нужно выбрать, какие из них удалить, ответив
y
на вопрос выше.источник
Если у вас есть bash с автозаполнением, это может сработать для вас. Я набрал символ, который был показан в списке каталогов. Затем я запустил автозаполнение и переименовал вещь в нечто, что можно распечатать.
Вот что сработало для меня:
источник
работал на меня.
источник