Получение вывода находки.-print0 в массив удара

SNMP ++ является также хорошей и библиотекой с открытым исходным кодом для разработчиков C++.

http://www.agentpp.com/api/cpp/snmp_pp.html

73
задан Idris 12 July 2009 в 21:35
поделиться

8 ответов

Бесстыдно украдено из 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, а не через стандартный ввод.

99
ответ дан 24 November 2019 в 12:21
поделиться

Это похоже на версию 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[@]}
0
ответ дан 24 November 2019 в 12:21
поделиться

По возможности избегайте 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' 
1
ответ дан 24 November 2019 в 12:21
поделиться

Еще один способ подсчета файлов:

find /DIR -type f -print0 | tr -dc '\0' | wc -c 
4
ответ дан 24 November 2019 в 12:21
поделиться

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...)

2
ответ дан 24 November 2019 в 12:21
поделиться

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.

7
ответ дан 24 November 2019 в 12:21
поделиться

Я думаю, что существуют более элегантные решения, но я добавлю это. Это также работать с именами файлов с пробелами и / или символами новой строки:

i=0;
for f in *; do
  array[$i]="$f"
  ((i++))
done

Затем вы можете, например, перечислить файлы один за другим (в данном случае в обратном порядке):

for ((i = $i - 1; i >= 0; i--)); do
  ls -al "${array[$i]}"
done

Эта страница дает хороший пример,

1
ответ дан 24 November 2019 в 12:21
поделиться

Я новичок, но считаю, что это ответ; надеюсь, это кому-то поможет:

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
1
ответ дан 24 November 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: