Существует три набора настроек локали ¹:
LANG
, установка нейтрализации, если Вы не указали значение для категории. Это - отступ для пользователей для указания на их локаль простым способом.LC_xxx
для каждой категории (xxx
может быть MESSAGES
, TIME
, и т.д.).LC_ALL
переопределения все настройки. Это - путь к приложениям для переопределения всех настроек для работы в известной локали (обычно C
, локаль по умолчанию), обычно так, чтобы различные команды произвели вывод в известном формате.Таким образом, можно установить LANG=de_AT.UTF-8
и LC_MESSAGES=C
(C
локаль по умолчанию и означает непереведенный; en_US
обычно идентично C
для сообщений).
Однако существует две категории, где я не рекомендую изменить значение по умолчанию, потому что оно повреждает много программ:
LC_COLLATE
символьный порядок сопоставления. Это не очень полезно, потому что это только указывает, как отсортировать символы, не, как отсортировать строки. Инструменты, которые знают, как отсортировать строки, не используют LC_COLLATE
. Кроме того, много инструментов ожидает вещи как “[a-z]
соответствия все 26 строчных букв ASCII и никакие другие символы ASCII”, но это не верно в большинстве локалей не по умолчанию (попытка echo B | LC_COLLATE=en_US grep '[a-z]'
).LC_NUMERIC
указывает, как отобразить числа. В частности, на многих языках это заставляет числа с плавающей точкой использовать a ,
вместо .
как десятичная точка. Но большинство программ, которые анализируют числа, ожидает a .
и обработка a ,
как разделитель полей.Таким образом, я рекомендую
LC_COLLATE=C LC_NUMERIC=_C
,LANG
сброс и только установленный значение для полезных категорий (LC_MESSAGES
, LC_TIME
, LC_PAPER
, плюс LC_CTYPE
(чье значение может варьироваться в зависимости от Вашего терминала)).¹ Плюс LANGUAGE
с GNU libc. Если Вы не услышали об этом, Вы не отсутствуете очень.
Попробуйте это:
#!/bin/bash
while IFS= read -r pp; do
find . -iname "*${pp}*" -print0
done < /path/to/pattern.txt
Не уверенный, почему Вы хотите -print0
, но я оставил его внутри так или иначе. Возможно, Вы пытаетесь передать это по каналу к xargs
?
Вот безопасный и защищенный от Windows способ искать набор шаблонов имени файла, полученных из файла. Подход, который я выбрал, должен обработать список шаблонов в a find
выражение.
find_expression=$(<pattern \
sed -e 's/^/-o\n-iname\n*/' \
-e 's/\r\?$/*/' | # turn each pattern into -o -iname *foo*
tail -n +2) # remove spurious initial -o
set -f # turn off globbing
IFS='
' # split only at newlines
find . \( $find_expression \) -print0
set +f; unset IFS # restore defaults
find
обработать многочисленное (возможно, тысячи) args, по сравнению с вызовом find
времена unpteen... IFS задерживает многострочный вывод к строке args в форме: -iname *abc*
, каждый разделенный -o
(который я принимаю, означает "или")... Howerver я немного озадачен \( \)
.. действительно ли они - функция оболочки для группировки args, или действительно ли они - конкретное требование find
?... (загадка почти решена.. :)
– Peter.O
02.04.2011, 13:10
\(
и \)
передаются find
как (
и )
соответственно; единственной функцией оболочки, использованной там, является обратная косая черта для заключения в кавычки следующего символа (так, чтобы круглые скобки не были интерпретированы как таковые оболочкой). Остальное find
синтаксис выражения: (
и )
для группировки выражения, -o
как двоичный файл “или” оператор.
– Gilles 'SO- stop being evil'
02.04.2011, 14:17
Ответ @SiegeX подарки будет работать, но если у Вас есть много файлов в Вашем файле шаблона, это могло бы стать медленным и неуклюжим. Вы могли бы получить намного лучшую производительность при помощи другого инструмента, как это:
find . | grep -f pattern.txt
Да, это было всем этим.