Я пытаюсь найти файлы с помощью find
и поместить эти файлы в массив Bash, чтобы я мог выполнять над ними другие операции (например, ls
или grep
их). Но я не могу понять, почему readarray
не читает find
вывод, так как он передается по нему.
Скажем, у меня есть два файла в текущем каталоге, file1.txt
и file2.txt
. Таким образом, find
вывод выглядит следующим образом:
$ find . -name "file*"
./file1.txt
./file2.txt
Поэтому я хочу передать это в массив, двумя элементами которого являются строки "./file1.txt"
и "./file2.txt"
(без кавычек, очевидно).
Я пробовал это, среди прочего:
$ declare -a FILES
$ find . -name "file*" | readarray FILES
$ echo "${FILES[@]}"; echo "${#FILES[@]}"
0
Как видно из echo
вывода, мой массив пуст.
Так что именно я здесь делаю не так? Почему readarray
не считывать find
вывод в качестве стандартного ввода и помещать эти строки в массив?
readarray -d '' < <(find your_args -print0)
Правильное решение:
Это похоже на то, что Greg BashFAQ 020 подробно объясняет, и этот ответ охватывает .
Не имеет проблем с нечетными именованными файлами (которые не содержат NUL в имени), с пробелами или новыми строками. И результат устанавливается в массиве, что делает его полезным для дальнейшей обработки.
источник
readarray
также можно читать со стандартного вводаисточник
find -print0
для защиты от "неожиданных" имен файлов.