Файл и каталог с одинаковым именем в одном родительском каталоге — Solaris 8, ufs
-
01-07-2019 - |
Вопрос
Хорошо, я работаю с 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
Итак, вот мой вопрос из двух частей:
- Что с этим случилось?
- Как аккуратно удалить файл?
Джонатан
Редактировать:Спасибо за ответы, ребята, оба (пока) были полезны, но передача списка редактору помогла, увы:
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
Как только вы это сделаете, у вас снова появятся вменяемые имена файлов, которые вы сможете исправить по своему усмотрению.