Найти файл в пути без “который”?

file команда делает "лучшие предположения" о кодировании. Используйте -i параметр для принуждения file распечатать информацию о кодировании.

Демонстрация:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

Вот то, как я создал файлы:

$ echo ä > umlaut-utf8.txt 

В наше время все - utf-8. Но убедите себя:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

Сравните с https://en.wikipedia.org/wiki/Ä#Computer_encoding

Преобразуйте в другую кодировку:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

Проверьте шестнадцатеричный дамп:

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

Создайте что-то "недопустимое" путем смешивания всех трех:

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

Что file говорит:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

без -i:

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

file команда понятия не имеет о "допустимых" или "недопустимых". Это просто видит некоторые байты и попытки предположить, каково кодирование могло бы быть. Как люди мы смогли распознавать, что файл является текстовым файлом с некоторыми умляутами в "неправильном" кодировании. Но как компьютер этому был бы нужен своего рода искусственный интеллект.

Можно было бы утверждать что эвристика file своего рода искусственный интеллект. Все же, даже если это, это - очень ограниченное.

Вот больше информации о file команда: http://www.linfo.org/file_command.html

12
14.03.2011, 00:24
5 ответов

Используйте эту команду: type assemble.sh

Это работает во множестве оболочек и показывает только первый результат.

17
27.01.2020, 19:54
  • 1
    Или просто type assemble.sh, который является портативным (и только показывает первое соответствие тогда как type -a конструкция ksh/bash должна показать все соответствия). –  Gilles 'SO- stop being evil' 14.03.2011, 00:24

Или разделение путь и использование это в находке - первое соответствие должно быть решением

find ${PATH//:/ } -maxdepth 1 -name assemble.sh -print -quit

type конечно, более легко.

6
27.01.2020, 19:54
  • 1
    Это довольно полезно. Я не знал, что мог разделить $PATH на его sub компоненты и искать каждого с find –  Ehtesh Choudhury 10.01.2013, 10:33
  • 2
    Не попробовал, но я предполагаю, что это может порвать с пробелами в компонентах ПУТИ –  nhed 15.07.2016, 18:30

Можно использовать удар, но синтаксис which вывод показывает использование старого which записанный в csh. ПУТЬ обнаруживается заключенный в кавычки круглыми скобками, и каталоги в ПУТИ имеют записи как /opt/SUNWspro/bin и /usr/ccs/bin которые только имеют смысл в Солярисе. Это последовательно: Солярис использовал csh which.

Вот мое предположение: у Вас есть один ПУТЬ для удара и другой для csh. Это могло бы быть системной проблемой. Как я вспоминаю, Солярис сохраняет/etc/profile и/etc/cshrc файлы для установки PATH в масштабе всей системы. Те два файла инициализации могли бы установить различные переменные ПУТИ для различных оболочек. Действительно "повторите $PATH" под ударом и посмотрите, соглашается ли он с какой which команда распечатывает как строка ПУТИ.

4
27.01.2020, 19:54

Можно использовать locate assemble.sh найти местоположение файла.

0
27.01.2020, 19:54
  • 1
    Нет, это показывает местоположение всех (мир-) читаемые файлы, имя которых содержат assemble.sh, который не важен здесь. –  Gilles 'SO- stop being evil' 14.03.2011, 00:22
  • 2
    Это не не важно вообще. Даже если у него было несколько файлов, названных как этот locate также дал бы ему местоположение того, которое он хочет. assemble.sh не такое общее имя файла, таким образом, он, вероятно, найдет файл легко (который является тем, что OP запрашивает). –  nico 14.03.2011, 00:50
  • 3
    Не Делайте Вы имеете к updatedb прежде locate выставочные результаты? –  glenn jackman 14.03.2011, 02:02
  • 4
    Обычно updatedb ежедневно выполняется как задание крона, но да, Вам, вероятно, придется вызвать его, если файл является очень недавним. –  nico 14.03.2011, 02:15
command -v assemble.sh

Информация

-v        print a description of COMMAND similar to the `type' builtin
4
27.01.2020, 19:54
  • 1
    Также было бы полезно, если Вы хотите найти в измененной версии ПУТИ ASSEMBLE=$(PATH=/usr/bin:/usr/local/opt/coreutils/libexec/gnubin command -v assemble.sh) –  nhed 15.07.2016, 18:36

Теги

Похожие вопросы