Grep файл, в котором есть пробелы, расширяя переменную

Проверьте текущие настройки символов в PuTTY с помощью echo $LANG

Если это не производная UTF-8 (например, en_US.UTF-8 ), затем закройте сеанс и создайте новый сохраненный сеанс с именем хоста/IP, если вы еще этого не сделали.

Выделите сеанс, затем разверните окно конфигурации, выберите перевод и там вы сможете выбрать свою кодировку символов: Putty config

Запустите сеанс, и вы сможете вставлять символы UTF-8, как и ожидалось.

0
24.03.2019, 04:39
4 ответа

Если вы хотите сохранить список файлов для последующего циклического просмотра, лучше всего сохранить его в массиве.

Сbash:

readarray -td '' all_files < <(find. -type f -print0)
for file in "${all_files[@]}"; do
  grep hello "$file"
done

Сzsh(то же самое, но в качестве бонуса получите отсортированный список):

all_files=(./**/*(ND.))
for file ($all_files) grep hello $file
3
28.01.2020, 02:13

Напечатать все имена файлов, имеющие шаблон «привет»,

find. -type f -print0 | xargs -0 -L1 grep -l 'hello'

ИЛИ с findс grepвстроенным

find. -type f -exec grep -l 'hello' {} \;

ИЛИ проще (, если у вас только обычные файлы)

grep -Rl 'hello'.
3
28.01.2020, 02:13

Для всех, кто интересуется, как я решил эту проблему, я получил:

all_files=$( find. -type f -name *.txt -printf '%p' )

while read file
do
        grep 'hello' "$filename"
       .....
done <<< "$all_files"

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

Спасибо!

0
28.01.2020, 02:13

Вы не защищаете значение имен файлов, добавляя к ним кавычки в выводе find. Цикл по-прежнему будет рассматривать 'a filename'как две вещи для повторения. Как вы заметили, кавычки также будут частью строки.

Вместо этого запустите grepизfind:

find. -type f -exec grep 'hello' {} \;

Это будет выполняться grepодин раз для каждого найденного файла.

find. -type f -exec grep 'hello' {} +

Это будет выполнять grepдля максимально возможного количества файлов одновременно (и, таким образом, также выводить имена файлов для пакетов с более чем одним файлом, используйте параметр -hс GNU grepили совместимый, чтобы не напечатать имя файла ).

Все еще с GNUgrep:

grep -D skip -r 'hello'.

Это запустит grepрекурсивно в текущем каталоге, пропуская не -обычные файлы (, как -type fдля find), но по-прежнему просматривает символические ссылки на обычные файлы (, как если бы использовалось ГНУ find -xtype f).

4
28.01.2020, 02:13

Теги

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