Как мне захватить вывод команды ls или find для сохранения всех имен файлов в массиве? - PullRequest
33 голосов
/ 13 января 2011

Необходимо обрабатывать файлы в текущем каталоге по одному. Я ищу способ взять выходные данные ls или find и сохранить полученное значение в качестве элементов массива. Таким образом, я могу манипулировать элементами массива по мере необходимости.

Ответы [ 4 ]

48 голосов
/ 13 января 2011

Чтобы ответить на ваш точный вопрос, используйте следующее:

arr=( $(find /path/to/toplevel/dir -type f) )

Пример

$ find . -type f
./test1.txt
./test2.txt
./test3.txt
$ arr=( $(find . -type f) )
$ echo ${#arr[@]}
3
$ echo ${arr[@]}
./test1.txt ./test2.txt ./test3.txt
$ echo ${arr[0]}
./test1.txt

Однако, если вы просто хотите обрабатывать файлы по одному, вы можете использовать опцию find -exec, если сценарий несколько прост, или вы можете сделать цикл над тем, что find возвращает так:

while IFS= read -r -d $'\0' file; do
  # stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
9 голосов
/ 13 января 2011
for i in `ls`; do echo $i; done;

не может быть проще!

редактировать: хм - согласно комментарию Денниса Уильямсона, кажется, вы можете!

edit 2: хотя OP специально спрашивает, как анализировать выходные данные ls, я просто хотел отметить, что, как сказали комментаторы ниже, правильный ответ - «Вы не делаете». Используйте for i in * или аналогичный.

4 голосов
/ 13 января 2011

Вам фактически не нужно использовать ls / find для файлов в текущем каталоге.

Просто используйте цикл for:

for files in *; do 
    if [ -f "$files" ]; then
        # do something
    fi
done

И если вы хотите обрабатывать скрытые файлы, вы можете установить относительную опцию:

shopt -s dotglob

Эта последняя команда работает только в bash.

0 голосов
/ 13 января 2011

В зависимости от того, что вы хотите сделать, вы можете использовать xargs:

ls directory | xargs cp -v dir2

Например.Xargs будет действовать на каждый возвращенный элемент.

...