2013-03-23 4 views
3

У меня возникли проблемы с чтением файла в массив в bash.Bash Script Чтение файлов каталога в Array

Я заметил, что люди не рекомендуют использовать опцию ls -1. Есть ли способ обойти это?

+4

Можете ли вы пояснить немного больше о том, что вы пытаетесь сделать? Команда ls предназначена для перечисления каталога, а не для чтения файлов. – minism

+0

Возможный дубликат [Чтение имен файлов в массив] (http://stackoverflow.com/questions/10981439/reading-filenames-into-an-array) – miken32

ответ

15

Самый надежный способ получить список файлов с шаблона оболочки:

# First set bash option to avoid 
# unmatched patterns expand as result values 
shopt -s nullglob 
# Then store matching file names into array 
filearray=(*) 

Если вам нужно, чтобы получить файлы где-то, кроме текущего каталога, используйте:

filearray=("$dir"/*) 

Обратите внимание, что путь к каталогу должен быть в двойных кавычках, если он содержит пробелы или другие специальные символы, но * не может быть или он не будет расширен в список файлов. Кроме того, это заполняет массив путями к файлам, а не только именам (например, если $dir является «path/to/directory», filearray будет содержать «путь/в/каталог/файл1», «путь/в/каталог/file2 "и т. д.). Если вы хотите только имена файлов, вы можете обрезать путь префиксы с:

filearray=("$dir"/*) 
filearray=("${filearray[@]##*/}") 

Если вам необходимо включить файлы в подкаталогах, все становится немного сложнее; см. this previous answer.

+0

Я нахожусь в каталог массива. Итак, первый файл ** filearray = (*) ** будет получать все файлы в массив с каждым файлом, имеющим свой собственный индекс? – 2013-03-23 00:51:38

+0

@ sinful15: Да. BTW, обязательно поместите ссылки на имена файлов в двойных кавычках, как в '' $ {filearray [1]} "' только для одного файла или '' $ {filearray [@]} "' для полного списка. –

+0

Удивительный ответ, помог тонне! – dardo

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