Вопрос по unix, bash, cygwin – Чтение имен файлов в массив
Я хочу получить список файлов и затем прочитать результаты в массив, где каждый элемент массива соответствует имени файла. Это возможно?
ls
это не путь. Попробуй это:
declare -a FILELIST
for f in *; do
#FILELIST[length_of_FILELIST + 1]=filename
FILELIST[${#FILELIST[@]}+1]=$(echo "$f");
done
Чтобы получить имя файла из массива, используйте:
echo ${FILELIST[x]}
Чтобы получить n имен файлов из массива, начиная с x, используйте:
echo ${FILELIST[@]:x:n}
Для большого учебника по массивам bash, смотрите: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/
array+=(element)
, Нет причин использовать$(echo "$f")
просто сделайте задание напрямую. Отсутствует закрывающая фигурная скобка на одном из вашихecho
заявления.
ls
этоне предназначено для этого. Используйте шатание.
shopt -s nullglob
array=(*)
array2=(file*)
array3=(dir/*)
nullglob
опция заставляет массив быть пустым, если нет совпадений.
pathname expansion (globbing) вот так:
#!/bin/bash
SOURCE_DIR=path/to/source
files=(
"$SOURCE_DIR"/*.tar.gz
"$SOURCE_DIR"/*.tgz
"$SOURCE_DIR"/**/*
)
Выше будет создан массив с именемfiles
и добавить к нему N элементов массива, где каждый элемент в массиве соответствует элементу вSOURCE_DIR
кончающийся на.tar.gz
или же.tgz
или любой элемент в его подкаталоге с возможной рекурсией поддиректории, такой как Dennisуказывает на то в комментариях.
Вы можете использоватьprintf
чтобы увидеть содержимое массива, включая пути:
printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz
Или используяparameter substitution чтобы исключить пути:
printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz
hash
работает только с внешними исполняемыми файлами (попробуйтеhash -t ls
а такжеhelp hash
) и не собирается показывать что-либо дляshopt
потому что это встроенный или дляglobstar
потому что это вариант, а не исполняемый файл. Пытатьсяtype -a shopt
показать гдеshopt
приходит иshopt
Сам по себе, чтобы показать настройки всех ваших вариантов. использованиеecho "$BASH_VERSION"
чтобы показать версию вашей в настоящее время запущенной оболочки (если это Bash) и посмотреть выводps -o tty,command
чтобы увидеть, действительно ли это/bin/bash
, сравнитьfind /usr -type d | wc -l
а такжеecho /usr/**/ | tr -cd " " | wc -c
...
globstar
, Что означает подсчет символов в некоторых именах каталогов сecho /usr/**/ | wc -c
выход для вас? На моем Mac, в Сьерре с Bash 3.2 или в Bash 4.4 сglobstar
выкл, это выводит 122. Если я запускаю Bash 4.4 сglobstar
Я получаю 277904. Последнее явно рекурсивно, а первое - нет. КСТАТИ,shopt
определяется, но я предполагаю, что вы имеете в видуglobstar
(в Bash 3.2,shopt -p globstar
выдает ошибку, в Bash 4.4 она показывает, установлена она или не установлена).