Bash: вывод трубы «find» в «readarray»

Я пытаюсь найти файлы с помощью find и помещать эти файлы в массив Bash, чтобы я мог выполнять другие операции над ними (например, ls или grep ). Но я не могу понять, почему readarray не читает вывод вывода, поскольку он подключен к нему.

Скажем, у меня есть два файла в текущем каталоге: file1.txt и file2.txt . Таким образом, вывод find выглядит следующим образом:

 $ find . -name "file*" ./file1.txt ./file2.txt 

Поэтому я хочу "./file1.txt" это в массив, чьи два элемента являются строками "./file1.txt" и "./file2.txt" (без кавычек, очевидно).

Я пробовал это, среди нескольких других вещей:

 $ declare -a FILES $ find . -name "file*" | readarray FILES $ echo "${FILES[@]}"; echo "${#FILES[@]}" 0 

Как видно из вывода echo , мой массив пуст.

Итак, что именно я делаю неправильно здесь? Почему readarray не считывает вывод find качестве стандартного ввода и помещает эти строки в массив?

  • Исключить из подстановочного знака (*), используя find
  • Поиск файлов на основе измененной даты (с указанием точного часа)
  • Найти каталог, содержащий все файлы в моем списке
  • Как показать разные каталоги на поиске?
  • Комбинация команды find и grep с опцией exec
  • Как удалить старые файлы в папке в unix?
  • найти поиск в родительских каталогах вместо подкаталогов
  • найти файлы с расширенными атрибутами
  • 3 Solutions collect form web for “Bash: вывод трубы «find» в «readarray»”

    При использовании конвейера bash запускает команды в подоболочках. Поэтому массив заполняется, но в подоболочке, поэтому родительская оболочка не имеет к нему доступа.

    Использовать замену процесса:

     readarray FILES < <(find) 

    Обратите внимание, что он не работает для файлов с символами новой строки в их именах.

    Правильное решение:

     unset a; declare -aa while IFS= read -r -u3 -d $'\0' file; do a+=( "$file" ) # or however you want to process each file done 3< <(find /tmp -type f -print0) 

    Это похоже на то, что подробно объясняет Greg's BashFAQ 020, и этот ответ охватывает .

    Не имеет проблем с нечетными именованными файлами (которые не содержат NUL в имени), с пробелами или новыми строками. И результат задается в массиве, что делает его полезным для дальнейшей обработки.

    readarray также может читать из stdin

     readarray FILES <<< "$(find . -name "file*")"; echo "${#FILES[@]}" 
    Interesting Posts

    Ядро и пользовательское пространство Системные вызовы

    Разрешения на создание некоторых (но не всех) файлов, видимых непосредственно под каталогом

    Автоматические обновления пакетов dpkg

    Могу ли я передать текущий процесс из мертвого ssh

    Почему я получаю сообщение об ошибке: «Плохая запись» en_US »при генерации локалей?

    режимы, не отображающиеся в строке состояния vim

    Расширение скобки Bash для удаления части имени файла

    Debian 9 apt-get update возвращает файловую систему ошибок только чтение

    Как устранить неисправность udev, не создавая / dev / hda3 при загрузке gentoo?

    регулярное выражение nginx с proxypass

    Кэш всех паролей паролей gpg сразу? Предотвратить необходимость ввода нескольких паролей в gpg?

    Безопасность xhost (локальная) и пересылка sudo xauthority

    Игнорировать «другие» домены при загрузке с помощью wget?

    Мне не удастся использовать функцию Flisebox ResizeTo

    Значок не отображается в приложениях на OSX

    Linux и Unix - лучшая ОС в мире.