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


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.