Как создать цикл Bash

xargs уже не так полезен, как раньше; find был исправлен, так что он больше не нужен. Если вы закончите свою командную строку -execсимволом +вместо ;, find вызовет командную строку для пакетов самих результатов. Как указал mosvy, xargs, по общему признанию, работает параллельно с find, но я не нашел, что это очень важно для моей обработки. Однако это, вероятно, для вас, поскольку вы просматриваете сжатые файлы в своем цикле.

find./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -lr "$classpathjarname" {} +

Ваша замена не сработала, потому что вы ее не поняли; то, как работала ваша первая версия, зависело от zipgrep, сообщающего через свой статус выхода, соответствует ли файл или нет. Этот вариант зависит от zipgrep, сообщающего о совпадающих именах файлов, что и делает опция -l.

find./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -print0 | xargs -0 -P2 zipgrep -lr "$classpathjarname"

- это то, как вы бы сделали это с помощью xargs. Ваши сообщения об ошибках zipgrep связаны с тем, что у вас, по-видимому, есть файл, который либо не является zip-файлом, либо является пустым zip-файлом, который find отправляет в zipgrep.

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

1
28.01.2021, 03:22
2 ответа

Вы можете использовать простую петлю forкак

beg=1
end=5
for i in $(seq $beg $end)
do
    QRCode[$i]=$(cat /etc/wireguard/qr/client$i) 
done

Это создает массив bash, и вы можете получить доступ к i-му элементу как $QRCode[$i]или ко всему массиву с помощью ${QRCode[*]}. Массивы в bash не обязательно должны начинаться с индекса 0.

0
18.03.2021, 22:34

Я бы использовал массив вместо одиночных переменных, зная, сколько существует файлов:

declare -a QRCodes

for i in {1..10}; do 
  QRCodes[$i]="$(cat /etc/wireguard/qr/client$i)"
done

Затем, чтобы получить конкретное значение:

$ echo "${QRCodes[1]}"
<some value from client1 file>

Чтобы получить все значения:

printf "%s\n" "${QRCodes[@]}"
1
18.03.2021, 22:34

Теги

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