Сначала я использовал stat -c %i file
(чтобы обнаружить присутствие тюрьмы ), который, казалось, работал на любом дистрибутиве Linux под солнцем. На OS X'е пришлось пользоваться ls -i file | cut -d ' ' -f 1
.
Есть ли способ найти номер индекса файла в сценарии оболочки, который переносим на платформы * nix и не зависит от общеизвестно капризного ls
?
Ответы:
Возможное решение: спецификация POSIX для
ls
спецификаций-i
, поэтому, возможно, она переносима. Кто-нибудь знает о популярной реализации,ls
которая не поддерживает это, или печатает ее иначе, чем в следующем примере:источник
stat
не работала на OS X,ls -di
работала на обоих.ls
имеет-d
и в-i
качестве обязательных функций (хотяls
сам по себе является необязательным, как и все остальное).ls
с-i
передними подушечками с пробелами по крайней мере , Solaris 10 (возможно , Solaris 11, я не проверил). Похоже, что это было традиционное поведение, восходящее к Unix версии 7, поэтому я подозреваю, что многие корпоративные разновидности * nix сохранили это поведение (хотя у меня только Solaris 10 под рукой). Насколько я могу судить, если вы используете что-то, что правильно разграничивает поля в произвольном пробеле (то есть, нетcut
, но, например,awk
или просто собственное разбиение поля оболочки), можно ожидать, что первая непробельная строка будет индексом число.Он должен быть переносимым и работать с именами файлов, содержащими пробелы, символы новой строки или другие нечетные символы, что приводит к общеизвестному капризному поведению ls.
источник
Для повышения переносимости вы также можете реализовать платформо-зависимую функцию-оболочку (здесь она вызывается
statinode()
) вокругstat
команды, которая может быть основана на выводеuname -s
(см. Uname ).ls
будет необходим только в качестве запасного варианта.источник
stat
является частью пакета GNU Coreutils . OSX использует другуюstat
реализацию (предположительно основанную на BSD), которая не принимает те же аргументы командной строки.Вы всегда можете установить GNU Coreutils на OSX. Конечно, это не поможет, если вам нужно решение, которое работает на системах OSX, не имеющих GNU Coreutils.
Или, если я правильно читаю man-страницу OSX stat (1) ,
stat -f %i file
в OSX ведет себя какstat -c %i file
при использовании версии Coreutils. (Определить, какая уstat
вас версия , это другое дело; вы можете попробоватьstat --version >/dev/null
; в случае успеха у вас есть версия GNU Coreutils.)ls -di
Решение более компактно и меньше хлопот, но это альтернатива.источник
Другое решение:
Вы, вероятно, можете смело предположить, что Perl установлен.
источник
Подобно подходу Джеффа,
stat
может быть также проверено напрямую.источник