LINUX.ORG.RU

Поместить имена файлов в массив bash

 , , , ,


1

3

В bash есть поддержка массивов.
У меня есть куча файлов с расширением .vala. Нужно поместить пути к ним (без расширения) в массив и для каждого файла выполнить определённые действия. Как это грамотно сделать?
Сейчас сделал так:

#!/bin/bash

FILES=(`find . -name '*.vala' | sed 's/\.\/\(.\+\).vala$/\1/g'`)

for ((i=0; i<${#FILES[@]}; i++))
do
    echo $i: ${FILES[$i]}
done
Всё вроде бы хорошо, пока в пути не появляется пробел (возможно, какой-нибудь ещё нехороший символ может всё испортить). Как экранировать этот пробел в массиве?

★★★★★

Если массив только для того, чтобы «для каждого файла выполнить определённые действия», то массив не нужен.

Я б сделал так:

$ find . -name '*.vala' | while read A ; do echo $(basename "$A" \.vala ) ; done
echo заменить на комманду, которая делает с файлом что нужно.

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 3)
[den4ik ~ ]$ ls
Fxpr_w7pro.xml  pizza_30.04.14.zip  TMnXhz9op64.jpg  windsurfer.jpg
[den4ik ~ ]$ readarray -t jpgarr < <(ls *.jpg | xargs -0 basename -s .jpg)
[den4ik ~ ]$ echo ${jpgarr[0]}
TMnXhz9op64
[den4ik ~ ]$ echo ${jpgarr[1]}
windsurfer
ii343hbka ★★★ ()
Последнее исправление: ii343hbka (всего исправлений: 2)

Если массив вс=ё-таки зачем-то нужен:

$ OLD_IFS="$IFS"; IFS=$'\n'; A=( $(find . -name '*.vala' ) ); IFS="$OLD_IFS"
$ for D in "${A[@]}"; do echo $(basename "$D" \.vala ); done

Kroz ★★★★★ ()
Ответ на: комментарий от Kroz

for D in «${A[@]}»

D уже не рулит, используй Go или Rust

zolden ★★★★★ ()
Ответ на: комментарий от greenplastik

python, php, lua

Говно зачеркнул, а на Lua это делается довольно легко. Проблема в том, что интерпретатор есть не у всех.

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

Говно зачеркнул

Это ты зря. У тебя фобии странные. То что питоне делается одной строчкой ты в баше будешь делать сотнями строк и оно будет жутко тормозить. Собери статические версии питона. Ну или LD_PRELOAD_PATH.

greenplastik ()
Ответ на: комментарий от greenplastik

Не надо заниматься извращением на баше. Освой python, php, lua

Ещё один.
Покажи-ка решение задачи ТС'а на Питоне, пхп, луа.

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от beastie

Ещё проще (и что б не терять путь):

find . -name "*.vala" | while read A; do echo "Got file '${A%.vala}'"; done

PS: с пробалами тут всё в порядке.

beastie ★★★★★ ()
Ответ на: комментарий от beastie

Да, этот вариант работает хорошо, но я массив хочу, чтобы обходить его в цикле без всяких ухищрений.

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

Пожалуюста:

#!/bin/bash

SUFFIX=".vala"
ARRAY=()

while read FILE; do
    ARRAY+=("${FILE%$SUFFIX}")
done < <(find . -name "*$SUFFIX")

for ITEM in "${ARRAY[@]}"; do
    echo ">>> '$ITEM'"
done
beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от ananas

ты даже не заметишь, как в твой eval попадёт что-то вроде рм рф

php головного мозга

забавно, что со своим eval о таком берёшься рассуждать

anonymous ()
Ответ на: комментарий от anonymous

таки параноик. пруф оформишь? с именем файла, которое бы, использованное в качестве элемента массива и заэкранированное в аргументе какой-либо команды, исполнило бы патч бармина

ananas ★★★★★ ()

а может твоя задача решается системой сборки?

anonymous ()
Ответ на: комментарий от ananas

как заэкранированное, давай целиком. для того что ты выше запостил достаточно \`speaker-test\`.vala

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.