Как я могу циклично выполниться через строки файла и найти файлы, соответствующие каждой строке?

Существует три набора настроек локали ¹:

  • 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. Если Вы не услышали об этом, Вы не отсутствуете очень.

3
02.04.2011, 01:32
3 ответа

Попробуйте это:

#!/bin/bash

while IFS= read -r pp; do
  find . -iname "*${pp}*" -print0
done < /path/to/pattern.txt

Не уверенный, почему Вы хотите -print0, но я оставил его внутри так или иначе. Возможно, Вы пытаетесь передать это по каналу к xargs?

2
27.01.2020, 21:11
  • 1
    Спасибо за предложение, но команду находки все еще ничего не находит. –  Azim 02.04.2011, 00:45
  • 2
    Да в конце я передам результаты по каналу к xargs для копирования файлов, которые он находит. –  Azim 02.04.2011, 00:46
  • 3
    благодарит за комментарий наряду с @Gilles наблюдением, я заставил это работать. –  Azim 02.04.2011, 00:58

Вот безопасный и защищенный от 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
4
27.01.2020, 21:11
  • 1
    @Gilles... Некоторые люди как кроссворды. Мне нравится пытаться разработать Ваши сценарии :) Я думаю, что начинаю распознавать Ваш шаблон :)... Вы позволяете единственный вызов find обработать многочисленное (возможно, тысячи) args, по сравнению с вызовом find времена unpteen... IFS задерживает многострочный вывод к строке args в форме: -iname *abc*, каждый разделенный -o (который я принимаю, означает "или")... Howerver я немного озадачен \( \).. действительно ли они - функция оболочки для группировки args, или действительно ли они - конкретное требование find?... (загадка почти решена.. :) –  Peter.O 02.04.2011, 13:10
  • 2
    @fred.bear: \( и \) передаются find как ( и ) соответственно; единственной функцией оболочки, использованной там, является обратная косая черта для заключения в кавычки следующего символа (так, чтобы круглые скобки не были интерпретированы как таковые оболочкой). Остальное find синтаксис выражения: ( и ) для группировки выражения, -o как двоичный файл “или” оператор. –  Gilles 'SO- stop being evil' 02.04.2011, 14:17

Ответ @SiegeX подарки будет работать, но если у Вас есть много файлов в Вашем файле шаблона, это могло бы стать медленным и неуклюжим. Вы могли бы получить намного лучшую производительность при помощи другого инструмента, как это:

find . | grep -f pattern.txt

Да, это было всем этим.

2
27.01.2020, 21:11

Теги

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