2012-06-11 5 views
41

Я хочу запустить ls, чтобы получить список файлов, а затем прочитать результат в массив, где каждый элемент соответствует имени файла. Это возможно?Чтение имен файлов в массив

+0

Да, это возможно. Может быть, не рекомендуется, если имена могут содержать произвольные символы (пробелы и символы новой строки в именах вызывают горе), но это выполнимо. В какой части руководства вы столкнулись с трудностями? –

ответ

65

Не используйте ls, это не предназначенные для этой цели. Используйте globbing.

shopt -s nullglob 
array=(*) 
array2=(file*) 
array3=(dir/*) 

nullglob опция заставляет массив не быть пустым, если там нет совпадают.

+0

Спасибо, я все равно могу передать результаты? Я пробовал что-то вроде arr (* | grep ".txt"), но ему это не нравится. – dublintech

+7

@dublintech: вам не нужно 'grep', просто введите строку в свой glob:' array = (*. Txt) 'или' array = (* foo *) ' –

+0

Спасибо Denis. Это сработало. – dublintech

11

После создаст массив обр с выходом LS в текущем каталоге:

arr=($(ls)) 

Гораздо лучше и безопаснее, чем ls вы можете использовать echo *:

arr=(*) 

echo ${#arr[@]} # will echo number of elements in array 

echo "${arr[@]}" # will dump all elements of the array 
+2

'ls' не требуется и не должен использоваться для этой цели. –

+0

Согласен, я просто хотел рассказать, как создать массив из некоторого выходного файла команды. Однако я отредактировал свой ответ, чтобы подчеркнуть, что выход 'ls' следует избегать. – anubhava

+2

Когда расширение массива не цитируется, все элементы массива представлены как строка, а не отдельные элементы массива. Необязательные '$ {arr [*]}' и '$ {arr [@]}' совпадают. – jordanm

4

Фактически, ls - это не путь. Попробуйте это:

declare -a FILELIST 
for f in *; do 
    #FILELIST[length_of_FILELIST + 1]=filename 
    FILELIST[${#FILELIST[@]}+1]=$(echo "$f"); 
done 

Чтобы получить имена из массива:

echo ${FILELIST[x] 

-или-

echo ${FILELIST[@]:x:y} 

где х & у являются первым элементом, чтобы получить и сколько элементов после что.

Для большой учебник по Баш массивов, см: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

+1

Вы должны перебирать файл glob * OR * создавать массив, используя файл glob, как в моем ответе - не * both * !. При добавлении элементов в массив нет причин использовать длину массива в сложном выражении индекса (он не будет работать так, как ожидалось, если массив разрежен, с одной стороны). 'Массив + = (элемент)'. Нет смысла использовать '$ (echo" $ f ")' просто выполнить назначение напрямую.На одном из ваших высказываний 'echo' есть отсутствующая фигурная фигурная скобка. –

0

Попробуйте это,

PATH="" # could set to any absolute path 
declare -a ARRAY=(${PATH}/*) 

Я предполагаю, что вы будете вытаскивать ненужные вещи из списка ниже.

Смежные вопросы