मेरे पास नीचे दी गई स्क्रिप्ट है, जो एक तर्क के रूप में एक .csv फ़ाइल लेती है, जिसमें हजारों फ़ाइल नाम होते हैं। यह क्या करता है, प्रत्येक फ़ाइल नाम को पढ़ना है, इसे मेरे मोंगोडीबी में ढूंढना है, उस फ़ाइल को निकालना है और फिर इसे वर्तमान निर्देशिका में संग्रहीत करना है।

#!/bin/bash

MONGO_DATABASE="db"
MONGO_HOST="127.0.0.1"
MONGO_PORT="9999"
DATABASE_USERNAME="user"
DATABASE_PWD="pwd"

while read -r filename; do
    sudo mongofiles -h $MONGO_HOST -d $MONGO_DATABASE -u $DATABASE_USERNAME -p $DATABASE_PWD --quiet get "$filename"
done < "$1"

मैं जो सोच रहा हूं वह यह है कि चीजों को गति देने का कोई तरीका है, क्योंकि इसे खत्म करने में काफी समय लगता है! क्या मैं किसी प्रकार की समानता कर सकता हूं? मुझे bash के साथ बहुत कम अनुभव है इसलिए मुझे नहीं पता कि मैं क्या कर सकता हूं!

0
Sotiris Kaniras 14 पद 2019, 21:17

1 उत्तर

सबसे बढ़िया उत्तर

सबसे सरल xargs है:

xargs <"$1" -d$'\n' -P$(nproc) -n1 sudo mongofiles -h "$MONGO_HOST" -d "$MONGO_DATABASE" -u "$DATABASE_USERNAME" -p "$DATABASE_PWD" --quiet get

xargs इनपुट लाइन को लाइन से पढ़ता है और प्रक्रिया के तर्क के रूप में प्रत्येक लाइन को पास करता है। -d$'\n' निर्दिष्ट करता है कि रेखाएं नई रेखा से अलग होती हैं, लेकिन यह भी कि xargs रिक्त स्थान और उद्धरणों की व्याख्या नहीं करता है। -n1 xargs को प्रत्येक पंक्ति/तर्क के लिए कमांड चलाने के लिए कहता है। nproc सीपीयू की संख्या प्राप्त करने के लिए एक लिनक्स उपयोगिता है, और वह विकल्प -P को पास किया जाता है - जो समवर्ती रूप से चलने के लिए प्रक्रियाओं की संख्या निर्दिष्ट करता है।

1
KamilCuk 14 पद 2019, 18:27