Я хочу сделать это:
findstr /s /c:some-symbol *
или эквивалент grep
grep -R some-symbol *
но мне нужна утилита для автоматического определения файлов, закодированных в UTF-16 (и других), и соответствующего поиска по ним. В моих файлах даже есть пометка FFEE для упорядочения байтов, так что я даже не ищу героического автоопределения.
Какие-либо предложения?
Я имею в виду Windows Vista и XP.
Да, немного ASCII, немного UTF-16.





Согласно этому статья в блоге Дэймона Кортеси, grep, как вы выяснили, не работает с файлами UTF-16. Однако он представляет собой обходной путь:
for f in `find . -type f | xargs -I {} file {} | grep UTF-16 | cut -f1 -d\:`
do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f ${GREP_FOR}
done
Это, очевидно, для Unix, не уверен, что будет эквивалент в Windows. Автор этой статьи также предоставляет шелл-скрипт для выполнения вышеизложенного, который вы можете найти на github здесь.
Это только файлы greps в формате UTF-16. Вы также можете использовать grep для своих файлов ASCII обычным способом.
Вы не сказали, на какой платформе хотите это сделать.
В Windows вы можете использовать PowerGREP, который автоматически обнаруживает файлы Unicode, которые начинаются с отметки порядка байтов. (Также есть возможность автоматически определять файлы без спецификации. Автоопределение очень надежно для UTF-8, но ограничено для UTF-16.)
Спасибо за предложения. Я имел в виду Windows Vista и XP.
Я также обнаружил этот обходной путь, используя бесплатный Sysinternals strings.exe:
C:\> strings -s -b dir_tree_to_search | grep regexp
Strings.exe извлекает все найденные строки (из двоичных файлов, но отлично работает и с текстовыми файлами) и добавляет к каждому результату имя файла и двоеточие, поэтому примите это во внимание в регулярном выражении (или используйте вырезание или другой шаг в конвейере). -s выполняет рекурсивное извлечение, а -b просто подавляет баннерное сообщение.
В конечном итоге я все еще удивлен, что флагманские поисковые утилиты Gnu grep и findstr не обрабатывают кодировки символов Unicode изначально.
В их домашних средах unix UTF-16 встречается гораздо реже, а файлы обычно находятся в UTF-8, с которым они отлично справляются.
Может быть, не так хорошо для извлечения всей строки, но идеально подходит для поиска всех файлов, содержащих строку (что я пытаюсь сделать). Спасибо.
В Windows вы также можете использовать find.exe.
find /i /n "YourSearchString" *.*
Единственная проблема в том, что при этом печатаются имена файлов, за которыми следуют совпадения. Вы можете отфильтровать их, выполнив команду findstr
find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"
К сожалению, команда find не поддерживает шаблоны сопоставления, такие как findstr (подстановочные знаки / регулярные выражения).
Обходной путь - преобразовать ваш UTF-16 в ASCII или ANSI.
TYPE UTF-16.txt > ASCII.txt
Затем вы можете использовать FINDSTR.
FINDSTR object ASCII.txt
... простите, что?
findstr /s /c:some-symbol *
можно заменить следующей командой с учетом кодировки символов:
for /r %f in (*) do @find /i /n "some-symbol" "%f"
Если добавить ответ Венкатешвара ниже, вы получите: for / r% f in (*) do @find / i / n "some-symbol" "% f" | findstr / i "какой-то символ", который отфильтрует имена файлов. Я нашел это полезным при поиске набора файлов с поиском "Fail". Мне было все равно, в каком файле он появился, я просто хотел посмотреть, есть ли в каком-либо файле «Fail».
В более поздних версиях Windows UTF-16 поддерживается "из коробки". Если нет, попробуйте изменить активную кодовую страницу командой chcp.
В моем случае, когда использование только findstr не помогало для файлов UTF-16, однако оно работало с type:
type *.* | findstr /s /c:some-symbol
Некоторые из ваших файлов в UTF-16, а некоторые в ASCII, или как?