declare -a mass
find . -name "*" exec read -a mass {}\;
не работает
find . -name "*" | read -a mass{}\;
не работает
echo * | read -a mass
не работает
Даже echo * | wc -l работает не адекватно ... ответ будет Всегда 1
Запись результата поиска в массив
find . -name "*" exec read -a mass {}\;
c этим понятно. откуда mapfile будет читать-то?
find . -name "*" | read -a mass{}\;
не работает
это должно ИМХО работать, но у меня тоже не работает :(
echo * | read -a mass
не работает
Даже echo * | wc -l работает не адекватно ... ответ будет Всегда 1
тут всё правильно:
echo * выдаёт одну строчку. Попробуйте без mapfile (mapfile == синоним read -a)
ну лично я не загружаю юзера такой работой (вводить массивы), а прочитать из файла в массив можно и в цикле. (но зачем?).
Намного чаще нужно засунуть строку в массив
[console]doc@dt:~$ A=( `ls t*.*` )
doc@dt:~$ echo ${A[@]}
t.tar t.txt t2.txt ttt.sh
doc@dt:~$ echo ${A[3]}
ttt.sh
[/console]
много вариантов
1 например писать в файл а из него в массив
2 вроде то что нужно
[console]#! /bin/sh
IFS=$'\777'
array=( $(find /home/mogul82/ -maxdepth 2 -type f -exec printf "%s\777" '{}' + 2>/dev/null) )
echo ${array[0]}
[/console]
3 - для тек директории в цикле без find
[console]files=(*)
i=0
for file in "${files[@]}"
do
let i++
done
echo "${files[0]}"[/console]
Проблема решена ... Этот bash дикость какая то....
TerMih пишет:
find . -name "*" -exec read -a mass {}\;
c этим понятно. откуда mapfile будет читать-то?
Здесь мне как раз таки ничего и не понятно...
Команда find находит нужные мне файлы ... опция -exec говорит о том что с этим результатом будет работать след. команда bash а именно read -a, а записывать результат в mass, источник find, а приемник mass.
Если не затруднит, то объясните пожалуйста.
(Причем, я так понимаю, find выкинет целую кучу ответов, но {} \ говорит о том, что exec 'команда bash' будет обрабатывать каждый результат по отдельности! )
Да, кстати если написать так как я в цитате написал то ошибка find: missing argument to `-exec'
Если поставить пробелы (_ == пробел)
find . -name "*" -exec read -a mass_{}_\;
То видим find: `read': Нет такого файла или каталога (и такое выводи в консоль раз 10, а толку 0)
Причина заключена в синтаксисе? Или я чего то не понял?
Я в шоке .... проблема решалась очень просто, все что нужно было сделать это A=(`find ./ -name "03*`)
А я писал A=$(find ./ -name "03*)
Во втором случае в массиве 0 ячейка содержала ВСЕ, а в первом случае он красиво каждый результат записывает под свой индекс массива....
Этот bash дикость какая то....
обычный скриптовый ЯП. бывает и хуже...
Команда find находит нужные мне файлы ... опция -exec говорит о том что с этим результатом будет работать след. команда bash а именно read -a, а записывать результат в mass, источник find, а приемник mass.
Если не затруднит, то объясните пожалуйста.
[console]mapfile ARRAY[/console]
записывает стандартный вввод в ARRAY. А вы ей подсовываете имя файла в качестве второго параметра.
(Причем, я так понимаю, find выкинет целую кучу ответов, но {} \ говорит о том, что exec 'команда bash' будет обрабатывать каждый результат по отдельности! )
да. причём писать всё будет в один и тот-же массив,с 0го индекса.
-exec read -a mass {}\;
разворачивается в
read -a mass FILE_NAME;причём команда не закончена, должно быть
-exec COMMAND PARAMETRS;проблема в том, что оболочка съесть точку с запятой, и она не дойдёт до find, потому её надо экранировать.
ещё можно писать +, тогда команда получит все имена сразу, а не по одному. Точнее, все будут если влезут в строку, если в одну не влезут, а влезут в 10 минимум, то команда выполнится 10 раз.
Причина заключена в синтаксисе? Или я чего то не понял?
[console]$ help mapfile
mapfile: mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
Read lines from the standard input into an indexed array variable.
Read lines from the standard input into the indexed array variable ARRAY, or
from file descriptor FD if the -u option is supplied. The variable MAPFILE
is the default ARRAY.
Options:
-n count Copy at most COUNT lines. If COUNT is 0, all lines are copied.
-O origin Begin assigning to ARRAY at index ORIGIN. The default index is 0.
-s count Discard the first COUNT lines read.
-t Remove a trailing newline from each line read.
-u fd Read lines from file descriptor FD instead of the standard input.
-C callback Evaluate CALLBACK each time QUANTUM lines are read.
-c quantum Specify the number of lines read between each call to CALLBACK.
Arguments:
ARRAY Array variable name to use for file data.
If -C is supplied without -c, the default quantum is 5000. When
CALLBACK is evaluated, it is supplied the index of the next array
element to be assigned as an additional argument.
If not supplied with an explicit origin, mapfile will clear ARRAY before
assigning to it.
Exit Status:
Returns success unless an invalid option is given or ARRAY is readonly or
not an indexed array.
[/console]
конечно в синтаксисе. У команды может быть только один параметр, ARRAY. А вы ему второй суёте.
И ещё: read это команда shell'а, а не утилита. Причём с массивами она работает только в BASH'е. В простом /bin/sh никаких массивов нет. Причём find -exec, ЕМНИП, вызывает именно /bin/sh, а не /bin/bash. По этому тоже может не работать (а может и работать, если у вас /bin/sh это ссылка на /bin/bash).
Я в шоке .... проблема решалась очень просто, все что нужно было сделать это A=(`find ./ -name "03*`)
А я писал A=$(find ./ -name "03*)
не взлетит, если в имени файла есть пробелы.
Конструкция A=( STRING ) работает как php'шное explode - режет строку на куски, разделённые пробелами (и другими разделителями из $IFS), и каждый кусок пихает в массив. Например:
[console]$ STRING='a b c d e'
$ ARRAY=( $STRING )
$ for ((i = 0; i < 5; i++)); do echo "$i - ${ARRAY[$i]}"; done
0 - a
1 - b
2 - c
3 - d
4 - e
[/console]
ЗЫЖ
mogul82, \777 - это грязный хак. По документации один символ принадлежит диапазону 0..255, а 777 этому диапазону не принадлежит. (0777 == 511). ваш пример работает с текущей версией bash и в утф8, но он не будет работать в других версиях bash и/или с другой кодировкой.
К примеру в почте, в KOI8-R, этот символ ©
Спасибо за помощь, совместными усилиями сделал