Проверьте текущие настройки символов в PuTTY с помощью echo $LANG
Если это не производная UTF-8 (например, en_US.UTF-8
), затем закройте сеанс и создайте новый сохраненный сеанс с именем хоста/IP, если вы еще этого не сделали.
Выделите сеанс, затем разверните окно
конфигурации, выберите перевод
и там вы сможете выбрать свою кодировку символов:
Запустите сеанс, и вы сможете вставлять символы UTF-8, как и ожидалось.
Если вы хотите сохранить список файлов для последующего циклического просмотра, лучше всего сохранить его в массиве.
С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
Напечатать все имена файлов, имеющие шаблон «привет»,
find. -type f -print0 | xargs -0 -L1 grep -l 'hello'
ИЛИ с find
с grep
встроенным
find. -type f -exec grep -l 'hello' {} \;
ИЛИ проще (, если у вас только обычные файлы)
grep -Rl 'hello'.
Для всех, кто интересуется, как я решил эту проблему, я получил:
all_files=$( find. -type f -name *.txt -printf '%p' )
while read file
do
grep 'hello' "$filename"
.....
done <<< "$all_files"
Я знаю, что это плохая практика. Но для моего конкретного случая использования мне нужно было сделать много вещей для каждого имени файла. Не просто греметь. И теперь он работал безотказно.
Спасибо!
Вы не защищаете значение имен файлов, добавляя к ним кавычки в выводе 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
).