2012-03-31 2 views
28

Я пытаюсь сохранить список файлов в массиве, а затем снова пропустить массив. Ниже я получаю, когда я запускаю команду ls -ls с консоли.Как хранить файлы каталогов в массиве?

total 40 
36 -rwxrwxr-x 1 amit amit 36720 2012-03-31 12:19 1.txt 
4 -rwxrwxr-x 1 amit amit 1318 2012-03-31 14:49 2.txt 

Следующий сценарий bash, который я написал для хранения вышеуказанных данных в массив bash.

i=0 
ls -ls | while read line 
do 
    array[ $i ]="$line"   
    ((i++)) 
done 

Но когда я echo $array, ничего не получаю!

FYI, я запустить скрипт так: ./bashscript.sh

ответ

28

Попробуйте с:

#! /bin/bash 

i=0 
while read line 
do 
    array[ $i ]="$line"   
    ((i++)) 
done < <(ls -ls) 

echo ${array[1]} 

В вашей версии, while работает в подоболочки, переменные окружения вы модифицируют в цикле не видны вне его.

(имейте в виду, что анализ вывода ls обычно not a good idea at all.)

+0

'<(ls -ls)' Не могли бы вы объяснить это обозначение? Я не понимаю, почему это не просто 'ls -ls' – imagineerThat

+1

См. Http://mywiki.wooledge.org/ProcessSubstitution – Mat

4

Это может работать для вас:

OIFS=$IFS; IFS=$'\n'; array=($(ls -ls)); IFS=$OIFS; echo "${array[1]}" 
+1

Или проще:' IFS = $ '\ n' array = ($ (ls -ls)) ' – Guss

70

Я хотел бы использовать

files=(*) 

А потом если вам нужны данные о файле, например размер, используйте команду stat для каждого файла.

+1

Фантастический! Даже работает с именами каталогов заранее, чтобы получить файлы из более чем одного каталога (например, 'files_in_dirs = (dir/* other_dir/*)'. Очень полезно, спасибо. –

+0

это должно быть –

+4

А потом перечислить все элементы в этих файлах array: 'echo $ {files [@]}' или использовать это для цикла – HankCa

4

Вот вариант, который позволяет использовать шаблон регулярного выражения для начальной фильтрации, изменить регулярное выражение, чтобы получить необходимую фильтрацию.

files=($(find -E . -type f -regex "^.*$")) 
for item in ${files[*]} 
do 
    printf " %s\n" $item 
done 
+0

Это не будет работать с файлами, имена которых содержат пробелы. – chepner

+0

Я не понимаю, почему это не будет – harschware

+1

Word-splitting применяется к расширению подстановки команд, поэтому каждое пространство создает отдельный элемент массива. Если есть файл с именем 'foo bar.txt',' item' будет установлен в 'foo', то' bar.txt'. – chepner

0

Запуск любой команды оболочки внутри $(...) поможет сохранить вывод в переменную. Таким образом, используя это, мы можем преобразовать файлы в массив с IFS.

IFS=' ' read -r -a array <<< $(ls /path/to/dir) 
Смежные вопросы