2013-04-10 3 views
4

Скажем, у меня есть эта структура каталогов:Bash script - как заполнить массив?

DIRECTORY: 

.........a 

.........b 

.........c 

.........d 

То, что я хочу сделать, это: Я хочу, чтобы хранить элементы каталога в массиве

что-то вроде: array = ls /home/user/DIRECTORY

так что array[0] содержит имя первого файла (то есть 'а')

array[1] == 'b' т.д.

Спасибо за помощь

+0

Это может быть полезно: http://tldp.org/LDP/abs/html /arrays.html. Используйте цикл 'for', чтобы перебирать возвращаемые значения' ls'. – drewmm

+0

Это может быть полезно также; http://stackoverflow.com/questions/9954680/how-to-store-directory-files-listing-into-an-array – 2013-04-10 17:22:43

+0

Все ли эти точки в списке каталогов означают что-нибудь? –

ответ

8

Вы не можете просто сделать array = ls /home/user/DIRECTORY, потому что - даже с правильным синтаксисом - это не даст вам массив, но строку, вам придется разобрать, и Parsing ls is punishable by law. Вы можете, однако, использовать встроенный в Bash конструкции для достижения того, что вы хотите:

#!/usr/bin/env bash 

readonly YOUR_DIR="/home/daniel" 

if [[ ! -d $YOUR_DIR ]]; then 
    echo >&2 "$YOUR_DIR does not exist or is not a directory" 
    exit 1 
fi 

OLD_PWD=$PWD 
cd "$YOUR_DIR" 

i=0 
for file in * 
do 
    if [[ -f $file ]]; then 
     array[$i]=$file 
     i=$(($i+1)) 
    fi 
done 

cd "$OLD_PWD" 
exit 0 

Этот небольшой скрипт сохраняет имена всех обычных файлов (что не означает каталоги, ссылки, розетки и такие), которые могут можно найти в $YOUR_DIR массиву под названием array.

Надеюсь, это поможет.

+0

Это работает, но только для файлов. Я также хотел бы сохранить имя каталога в массиве (если есть) – user1926550

+0

Просто измените 'if' в цикле в соответствии с вашими потребностями. –

4

Вариант 1, ручной цикл:

dirtolist=/home/user/DIRECTORY 
shopt -s nullglob # In case there aren't any files 
contentsarray=() 
for filepath in "$dirtolist"/*; do 
    contentsarray+=("$(basename "$filepath")") 
done 
shopt -u nullglob # Optional, restore default behavior for unmatched file globs 

Вариант 2, с использованием Баш фокусы массива:

dirtolist=/home/user/DIRECTORY 
shopt -s nullglob 
contentspaths=("$dirtolist"/*) # This makes an array of paths to the files 
contentsarray=("${contentpaths[@]##*/}") # This strips off the path portions, leaving just the filenames 
shopt -u nullglob # Optional, restore default behavior for unmatched file globs 
Смежные вопросы