SNMP ++ является также хорошей и библиотекой с открытым исходным кодом для разработчиков C++.
Бесстыдно украдено из Greg's BashFAQ :
unset a i
while IFS= read -r -d $'\0' file; do
a[i++]="$file" # or however you want to process each file
done < <(find /tmp -type f -print0)
Обратите внимание, что использованная здесь конструкция перенаправления ( cmd1 <<(cmd2)
) похожа на, но не совсем то же самое, что более обычный конвейер ( cmd2 | cmd1
) - если команды являются встроенными в оболочку (например, , а
), конвейерная версия выполняет их в подоболочках, и любые установленные ими переменные (например, массив a
) теряются при выходе. cmd1 <<(cmd2)
запускает cmd2 только в подоболочке, поэтому массив живет после своей конструкции. Предупреждение: эта форма перенаправления доступна только в bash, даже не в bash в режиме sh-эмуляции; вы должны начать свой скрипт с #! / bin / bash
.
Также, потому что шаг обработки файла (в данном случае просто a [i ++] = "$ file"
, но вы можете захотеть сделать что-то более интересное прямо в цикле) его ввод перенаправлен, он не может использовать какие-либо команды, которые могут считываться из stdin. Чтобы избежать этого ограничения, я обычно использую:
unset a i
while IFS= read -r -u3 -d $'\0' file; do
a[i++]="$file" # or however you want to process each file
done 3< <(find /tmp -type f -print0)
... который передает список файлов через модуль 3, а не через стандартный ввод.
Это похоже на версию Stephan202, но файлы (и каталоги) помещаются в массив сразу. Цикл for
здесь предназначен только для того, чтобы «делать полезные вещи»:
files=(*) # put files in current directory into an array
i=0
for file in "${files[@]}"
do
echo "File ${i}: ${file}" # do something useful
let i++
done
Чтобы получить счет:
echo ${#files[@]}
По возможности избегайте xargs:
man ruby | less -p 777
IFS=$'\777'
#array=( $(find ~ -maxdepth 1 -type f -exec printf "%s\777" '{}' \; 2>/dev/null) )
array=( $(find ~ -maxdepth 1 -type f -exec printf "%s\777" '{}' + 2>/dev/null) )
echo ${#array[@]}
printf "%s\n" "${array[@]}" | nl
echo "${array[0]}"
IFS=$' \t\n'
Еще один способ подсчета файлов:
find /DIR -type f -print0 | tr -dc '\0' | wc -c
You can safely do the count with this:
find . -exec echo ';' | wc -l
(It prints a newline for every file/dir found, and then count the newlines printed out...)
Maybe you are looking for xargs:
find . -print0 | xargs -r0 do_something_useful
The option -L 1 could be useful for you too, which makes xargs exec do_something_useful with only 1 file argument.
Я думаю, что существуют более элегантные решения, но я добавлю это. Это также работать с именами файлов с пробелами и / или символами новой строки:
i=0;
for f in *; do
array[$i]="$f"
((i++))
done
Затем вы можете, например, перечислить файлы один за другим (в данном случае в обратном порядке):
for ((i = $i - 1; i >= 0; i--)); do
ls -al "${array[$i]}"
done
Эта страница дает хороший пример,
Я новичок, но считаю, что это ответ; надеюсь, это кому-то поможет:
STYLE="$HOME/.fluxbox/styles/"
declare -a array1
LISTING=`find $HOME/.fluxbox/styles/ -print0 -maxdepth 1 -type f`
echo $LISTING
array1=( `echo $LISTING`)
TAR_SOURCE=`echo ${array1[@]}`
#tar czvf ~/FluxieStyles.tgz $TAR_SOURCE