как добавить файл в текущем каталоге в массив - PullRequest
0 голосов
/ 29 февраля 2012
#! /bin/bash


dir=$(find . -type f)

echo ${dir[0]}
echo "This is dir[0]"
echo ${dir[1]}

Я хочу рекурсивно добавить все файлы в текущем каталоге в массив arr [], но приведенный выше код завершается ошибкой,

zhangyf@zhangyf-desktop:~/test/avatar$ ./new.sh 
./daily_burn.sh ./test.sh ./.gitignore ./new.sh 
This is dir[0]

dir не является массивом в этом коде. Какой правильный путь? Спасибо!

Ответы [ 3 ]

1 голос
/ 29 февраля 2012
dir=$(find . -type f)

должно быть

dir=(`find . -type f`)
1 голос
/ 29 февраля 2012

Вот небольшой полный тест оболочки для того, что вы хотите - выполнить его где-нибудь в безопасности, например, находясь в / tmp:

# Prepare
rm -rf root

mkdir root
mkdir root/1
touch root/1/a
touch root/1/b
#touch root/1/"b with spaces"
mkdir root/2
touch root/2/c
mkdir root/2/3
touch root/2/3/d

# Find
echo --- Find
find root

# Test
echo --- Test
files=(`find root -type f`)
echo $files

# Print whole array
flen=${#files[*]}
for (( i=0; i < $flen; i++ )); do
  echo files[$i] = ${files[i]}
done

Вывод этого:

--- Find
root
root/1
root/1/a
root/1/b
root/2
root/2/c
root/2/3
root/2/3/d
--- Test
root/1/a
files[0] = root/1/a
files[1] = root/1/b
files[2] = root/2/c
files[3] = root/2/3/d

ОсторожноОднако, пробелы в файле - если вы раскомментируете комментарий, отмеченный выше, удалив # перед этой строкой:

#touch root/1/"b with spaces"

, вы получите следующее:

--- Find
root
root/1
root/1/b with spaces
root/1/a
root/1/b
root/2
root/2/c
root/2/3
root/2/3/d
--- Test
root/1/b
files[0] = root/1/b
files[1] = with
files[2] = spaces
files[3] = root/1/a
files[4] = root/1/b
files[5] = root/2/c
files[6] = root/2/3/d

Очевидно, вы можете сделать что-то вроде этого:

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

1 голос
/ 29 февраля 2012
dir=(`find . -type f`)

echo ${dir[0]}
echo ${dir[1]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...