Файл и каталог с одинаковым именем в одном родительском каталоге — Solaris 8, ufs

StackOverflow https://stackoverflow.com/questions/83156

Вопрос

Хорошо, я работаю с Solaris более 10 лет и никогда такого не видел...

У меня есть список каталогов, который включает в себя как файл, так и подкаталог с одинаковым именем:

-rw-r--r--   1 root     other    15922214 Nov 29  2006 msheehan
drwxrwxrwx  12 msheehan sysadmin    2048 Mar 25 15:39 msheehan

Я использую файл для обнаружения содержимого файла и получаю:

bash-2.03# file msheehan
msheehan:       directory
bash-2.03# file msh*
msheehan:      ascii text
msheehan:       directory

Меня не беспокоит файл, но я хочу сохранить каталог, поэтому пробую rm:

bash-2.03# rm msheehan
rm: msheehan is a directory

Итак, вот мой вопрос из двух частей:

  1. Что с этим случилось?
  2. Как аккуратно удалить файл?

Джонатан

Редактировать:Спасибо за ответы, ребята, оба (пока) были полезны, но передача списка редактору помогла, увы:

bash-2.03# ls -l > jb.txt
bash-2.03# vi jb.txt

Который содержал:

-rw-r--r--   1 root     other    15922214 Nov 29  2006 msheehab^?n
drwxrwxrwx  12 msheehan sysadmin    2048 Mar 25 15:39 msheehan

Всегда будьте осторожны с клавишей Backspace!

Это было полезно?

Решение

Я предполагаю, что на самом деле это два разных имени файла, которые «выглядят» одинаково, поскольку командный файл смог отличить их, когда оболочка передавала расширенные версии имени.Попробуйте передать ls в od или другую утилиту шестнадцатеричного/восьмеричного дампа, чтобы проверить, действительно ли они имеют одинаковое имя или есть ли в нем непечатаемые символы.

Другие советы

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

Было бы интересно посмотреть, что выведет этот фрагмент Ruby:

ruby -e 'puts Dir["msheehan*"].inspect'

Вы можете удалить с помощью iNode

Если вы используете опцию «-i» в «ls»

$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?
20802 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a\?
$ find . -inum 20802 -exec rm {} \;
$ ls -li
total 1
20801 -rw-r--r-- 1 root root 0 2010-11-08 01:55 a?

У меня есть пример (на испанском языке), как можно удалить файл с помощью iNode в Solaris.http://sparcki.blogspot.com/2010/03/como-eliminar-archivos-utilizando-su.html

Урко,

И быстрый ответ на часть 2 моего собственного вопроса...

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

...Мне все равно было бы интересно посмотреть, что придумают другие люди.

Джей Би

Подозреваю, что у одного из них в названии странный персонаж.Вы можете попробовать использовать подстановочный знак оболочки, чтобы увидеть это:тип

cat msh*

и нажмите клавишу расширения подстановочного знака (в моей оболочке это Ctrl-X *).У вас должны быть перечислены два имени, возможно, в одном из которых есть escape-символ.

Чтобы увидеть, есть ли в вашем файле особые символы, попробуйте варианты -b или -q для LS, предполагая, что Solaris 8 имеет эти варианты.

В качестве другого решения для удаления файла вы можете поднять графический браузер файлов (задыхаться!) И перетащить нежелательный файл в мусор.

Другим решением может быть перемещение одного файла под другое имя (без неизвестного специального символа), а затем удаление имени каталога со специальными символами с помощью подстановочных знаков.

mv msheehan temp
rm mshee*
mv temp msheehan

Конечно, вы хотите быть уверены, что подстановочному знаку соответствует только тот файл, который вы хотите удалить.И в вашем конкретном случае, поскольку один из них был каталогом, а другой — файлом, эта команда могла бы решить всю проблему:

rmdir msheeha*

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

# ls -l | cat -vet

Приятно и легко запомнить!

Для части 2, поскольку одно имя содержит два дополнительных символа, вы можете использовать:

mv sheehan abc
mv sheeha??n xyz

Как только вы это сделаете, у вас снова появятся вменяемые имена файлов, которые вы сможете исправить по своему усмотрению.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top