"खोज" के उत्पादन को क्रमबद्ध करना?


77

मुझे findइसे कमांड करने से पहले वर्णानुक्रम से आउटपुट देने में सक्षम होना चाहिए । के | sort |बीच प्रवेश करना काम नहीं करता था, तो मैं क्या कर सकता था?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

जवाबों:


52

findहमेशा की तरह उपयोग करें और NUL के साथ अपनी रेखाओं का परिसीमन करें। GNU sort-z स्विच के साथ इन्हें संभाल सकता है:

find . -print0 | sort -z | xargs -r0 yourcommand

58

कुछ संस्करणों में sortएक -zविकल्प है, जो अशक्त रिकॉर्ड के लिए अनुमति देता है।

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

इसके अतिरिक्त, आप इसे करने के लिए एक उच्च-स्तरीय स्क्रिप्ट भी लिख सकते हैं:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

यह सुनिश्चित -rकरने के xargsलिए विकल्प जोड़ें कि myCommandएक तर्क के साथ कहा जाता है।


अच्छा एक (दो?) ... दिलचस्प है, हालांकि, दो तरीके .अलग-अलग संभालते हैं ... इसके साथ sortसूची के अंत में हवाएं होती हैं ... इसके साथ pythonशीर्ष पर छंटनी होती है। (शायद अजगर के साथ तरह LC_COLLATE=C)
पीटर।

-t \0सॉर्ट (जो एक -zसमानार्थी शब्द है) का विकल्प भी है
जेवियर

1
इन सभी |sortसमाधानों के साथ समस्या यह है कि आप -execअब और उपयोग नहीं कर सकते । ठीक है, हालांकि यह दिए गए आपके कथन को फिर से लिखना संभव है , क्योंकि -execयह काम करता है xargs, सवाल यह है कि "मिनी-स्क्रिप्ट" के बारे में क्या है ? ( sh -c ...) मैं उस आदेश को कई कमांड के साथ एक 'श-सी' मिनी-स्क्रिप्ट में बदलने के लिए तुच्छ नहीं कहूंगा ताकि यह xargs(यदि संभव हो तो, इसके साथ काम कर सके)
वाक्यविन्यास

@ साइनसेंटर: आपको xcgs के साथ sh -c का उपयोग करने में क्या समस्या है? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
रोजर पाटे

4

मुझे लगता है कि आपको इस -nप्रकार के झंडे की आवश्यकता है

मैन सॉर्ट के अनुसार:

-n, --numeric-sort
    compare according to string numerical value

संपादित करें

Print0 का इससे कुछ लेना-देना हो सकता है, मैंने अभी-अभी इसका परीक्षण किया है। Print0 को बाहर निकालें, आप -zध्वज का उपयोग करके स्ट्रिंग को इस प्रकार समाप्त कर सकते हैं


खैर, यह print0उन फिल्नामों को अंतरिक्ष-अलग करता हुआ प्रतीत होता है, जो मुझे अपने आदेश को पारित करने की आवश्यकता है, दुर्भाग्य से
औद्योगिक

1

यदि आपके पास GNU समानांतर http://www.gnu.org/software/parallel/ स्थापित है, तो आप ऐसा कर सकते हैं:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

आप केवल द्वारा GNU समानांतर स्थापित कर सकते हैं:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

अधिक जानने के लिए GNU समानांतर के इंट्रो वीडियो देखें: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


जीएनयू समानांतर का उपयोग करने का क्या औचित्य है? इसे गति देने के लिए?
पीटर मोर्टेंसन

उस और आपको \ N अलग रिकॉर्ड के साथ गड़बड़ करने की आवश्यकता नहीं है।
ओले तांगे सेप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.