Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Cygwin, case-insensitive поиск  (Прочитано 19856 раз)
0 Пользователей и 1 Гость смотрят эту тему.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« : 13-01-2011 12:31 » 

С *nix опыта мало - знаком только с основными командами, так что сорри за глупый вопрос если что Улыбаюсь

Суть проблемы:
Есть какая-то виндовая машинка, на ней установлен Cygwin+SSH. Я хожу туда через SSH и вызываю разные команды. Программно, а не руками.
Поскольку это винда, то её файловая система нечувствительна к регистру имен файлов/путей. Для неё файл test.ext и TEST.exT - один и тот же.
Для *nix это не очень работает. Жаль
Столкнулся с проблемой что если указываю путь к файлу не в том регистре - то он не находится.
Пример:
* Есть файл c:\WINDOWS\FileName.ext
* Я к нему обращаюсь как /cygdrive/Windows/filename.ext
Файл не находится. Жаль
Как вариант я могу выполнить сначала какую-то системную команду, чтоб она вернула правильное имя.
Но, как ни странно, они возвращают не совсем то Жаль
Пробовал:
Код: (Bash)
ls -1 /cygdrive/Windows/filename.ext # получаю /cygdrive/Windows/filename.ext
find /cygdrive/WINDOWS/ -iname filename.ext # работает меееееедленно, получаю /cygdrive/Windows/FileName.ext

Хочу получить /cygdrive/c/WINDOWS/FileName.ext
Жаль
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 13-01-2011 12:44 » 

baldr, попробуй locate filename.ext
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 13-01-2011 12:48 » 

locate -i filename.ext

Не возвращает ничего Жаль
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 13-01-2011 13:12 » 

baldr, какая версия Cygwin установлена?

в прежних версиях зависимость от регистра управлялась ключиком в переменной окружения CYGWIN
В новых версиях опцией в /etc/fstab. По умолчанию в новых версиях Cygwin диск /cygdrive монтируется с опцией posix=0, то есть регистронезависмый поиск файлов (http://www.cygwin.com/cygwin-ug-net/using.html#mount-table).

Кроме того, в реестре есть ключ HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
Если он равен 0, то в Cygwin включается зависимость от регистра (http://www.cygwin.com/cygwin-ug-net/using-specialnames.html#pathnames-casesensitive)

Кстати, вот как у меня выглядит вывод команды mount
C:/software/cygwin/bin on /usr/bin type ntfs (binary)
C:/software/cygwin/lib on /usr/lib type ntfs (binary)
C:/software/cygwin on / type ntfs (binary,auto)
C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto)
D: on /cygdrive/d type ntfs (binary,posix=0,user,noumount,auto)
E: on /cygdrive/e type ntfs (binary,posix=0,user,noumount,auto)
G: on /cygdrive/g type udf (binary,posix=0,user,noumount,auto)

Видно, что case-sensitive только каталоги с файлами самого cygwin-a, а диски Windows монтируются автоматически в режиме posix=0, то есть без зависимости от регистра
« Последнее редактирование: 13-01-2011 13:14 от npak » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #4 : 13-01-2011 13:34 » 

Код:
find . | perl -lne 'print $_ if m/test/i'

./test
./tesT
./TesT
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #5 : 13-01-2011 13:50 » 

Cygwin 5.2.
Какие бы настройки не стояли, менять их все равно нельзя..

Давайте сделаем целью не заставить принимать путь в любом формате, а получить путь в правильном регистре по неправильному.
Как это можно сделать?

McZim, спасибо..
"find /cygdrive/c/ | perl -lne 'print $_ if m/\/cygdrive\/c\/windows\/filename.ext/i'"
работает ооочень долго (секунд 30-60) и, судя по всему, нехило грузит комп.
Результат выдает, но это не вариант, к сожалению Жаль
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #6 : 13-01-2011 14:18 » 

Поробуй так:


Код:
find /cygdrive/c/ -print | perl -lne 'print $_ if m/\/cygdrive\/c\/windows\/filename.ext/i'

и кстате вот так тоже работает (предварительно updatedb).

Код:
locate -i filename.ext

есетсвенно намного быстрее, но я не знаю как это будет у тебя через эмулятор.
« Последнее редактирование: 13-01-2011 14:23 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 13-01-2011 14:35 » 

Столкнулся с проблемой что если указываю путь к файлу не в том регистре - то он не находится.
Пример:
* Есть файл c:\WINDOWS\FileName.ext
* Я к нему обращаюсь как /cygdrive/Windows/filename.ext
Файл не находится. Жаль

Хочу получить /cygdrive/c/WINDOWS/FileName.ext
Жаль

Кстати, в какой программе "не находится"? Все цигвиновские проги работают с файлами одинаково - если находит в одной программе, то должен найти и в другой.

Если надо найти имя без преобразований регистра, то есть как минимум два пути.
1. Использовать ls /cygdrive/c/Windows/ | grep -i filename.ext
2. Использовать globbing:
ls /cygdrive/c/Windows/[f]ilename.ext
или
ls /cygdrive/c/Windows/filename.ext*
В обоих случаях будет выведено имя файла без преобразований

Первый вариант (с grep) будет работать в любом шелле
Второй - только в том, который поддерживает wildcard expansion (bash, например)
« Последнее редактирование: 13-01-2011 14:43 от npak » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 13-01-2011 14:40 » 

find по умолчанию ищет рекурсивно во всех подкаталогах, отсюда и тормоза

Глубина поиска определяется предикатом -maxdepth:
find <path> -maxdepth 1 -a  -iname bla-bla-bla
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #9 : 13-01-2011 15:08 » 

npak, регистр может быть неправильный у всего пути Жаль
Разве что на "/cygdrive/c" можно положиться.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 13-01-2011 15:29 » 

baldr, так в какой программе проблема-то? Какая именно команда не находит путь?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #11 : 13-01-2011 15:32 » 

npak, это .NET-библиотека для работы через SSH: http://www.tamirgal.com/blog/page/SharpSSH.aspx
Отказывается копировать файл если он не в том регистре указан.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 13-01-2011 15:35 » 

npak, регистр может быть неправильный у всего пути Жаль
Разве что на "/cygdrive/c" можно положиться.

Хм. Попробуйте так:
cygpath `cygpath -w -l /cygdrive/c/windows/filename.ext`

У меня получается вот что:
diamond3 : tmp >$ cygpath `cygpath -w -l /cygdrive/c/windows/starter.xml`
/cygdrive/c/Windows/Starter.xml

команда cygpath -w -l  <path> преобразует cygwin-путь в "канонический" Windows путь. Во всеми необходимыми большими и малыми буковками (за это отвечает ключ -l)
команда cygpath без опций преобразует windows путь в Cygwin-путь. Сохраняя все большие и малые буковки
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 13-01-2011 15:40 » new

npak, это .NET-библиотека для работы через SSH: http://www.tamirgal.com/blog/page/SharpSSH.aspx
Отказывается копировать файл если он не в том регистре указан.

так это проблемы конфигурирования sshd , ИМХО.

Что выдают команды
bash>$ echo $CYGWIN
bash>$ mount
?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines