खोज परिणामों पर xargs का उपयोग करते समय मैं फ़ाइल नामों में स्थान कैसे संभाल सकता हूं?


28

मेरी एक सामान्य प्रथा एक निश्चित प्रकार की सभी फाइलों पर ग्रीप्स करना है, उदाहरण के लिए, उन सभी एचटीएमएल फाइलों को खोजें जिनमें "रंपस" शब्द है। यह करने के लिए, मैं का उपयोग करें

find /path/to -name "*.html" | xargs grep -l "rumpus"

कभी-कभी, findअपने नाम के रूप में एक स्थान के साथ एक फ़ाइल लौटाएगा जैसे कि my new file.html। जब इसे xargsपारित किया जाता है grep, हालांकि, मुझे ये त्रुटियां मिलती हैं:

grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory

मैं देख सकता हूं कि यहां क्या हो रहा है: या तो पाइप या xargsफाइलों के बीच रिक्त स्थान को सीमांकक मान रहा है। मेरे जीवन के लिए, हालांकि, मैं यह नहीं जान सकता कि इस व्यवहार को कैसे रोका जाए। क्या इसे find+ के साथ किया जा सकता है xargs? या मुझे एक पूरी तरह से अलग कमांड का उपयोग करना है?

जवाबों:


29

उपयोग

find ... -print0 | xargs -0 ...

जैसे

find /path/to -name "*.html"  -print0 | xargs -0  grep -l "rumpus"

खोज आदमी पृष्ठ से

-print0
          True; print the full file name on the standard  output,  followed
          by  a  null  character  (instead  of  the  newline character that
          ‘-print’ uses).  This allows file names that contain newlines  or
          other  types  of  white space to be correctly interpreted by pro-
          grams that process the find output.  This option  corresponds  to
          the ‘-0’ option of xargs.

15

आपको xargs का उपयोग करने की आवश्यकता नहीं है , क्योंकि खोज स्वयं कमांड निष्पादित कर सकती है। ऐसा करते समय, आपको नाम में वर्णों की व्याख्या करने वाले शेल के बारे में चिंता करने की आवश्यकता नहीं है।

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

खोज आदमी पृष्ठ से

-exec कमांड {} +
-exec कार्रवाई का यह संस्करण चयनित फाइलों पर निर्दिष्ट कमांड चलाता है, लेकिन कमांड लाइन अंत में प्रत्येक चयनित फ़ाइल नाम को जोड़कर बनाया गया है; कमांड की कुल संख्या का मिलान की गई फ़ाइलों की संख्या से बहुत कम होगा। कमांड लाइन उसी तरह से बनाई गई है जिस तरह से xargs अपनी कमांड लाइन बनाता है। कमांड के भीतर केवल `{} का एक उदाहरण दिया जाता है। कमांड को शुरुआती डायरेक्टरी में निष्पादित किया जाता है।


मैं इसे बढ़ा दूंगा लेकिन मेरे पास आज के लिए कुछ नहीं बचा है - मैं इसे कल करूंगा।
user9517

1
@ मैं - तुम वहाँ जाओ (मैं सहमत हूँ, वैसे)।
एडुआर्डो इवानेक

बस आप अभी भी xargs की सुविधाओं को याद करने का उपयोग कर पाते हैं, साथ ही आपको मूर्खतापूर्ण उद्धरण नियमों से निपटना पड़ता है। यदि आपके पास एक से अधिक कोर / CPU हैं, तो x तर्क को -P तर्क देखें।
Slartibartfast

8

यदि आपके सिस्टम पर खोज और xarg संस्करण समर्थन नहीं करते हैं -print0और -0स्विच करते हैं (उदाहरण के लिए AIX ढूँढें और xargs) तो आप इसका उपयोग कर सकते हैं:

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

यहाँ sed, xargs के रिक्त स्थान से बचने का ध्यान रखेगा।


इससे मुझे मदद मिली क्योंकि मेरे पास फ़ाइल नामों की एक लंबी सूची थी जो कि कई बार उपयोग करने में मुश्किल थी। मैं बस findउन सब को फिर से नहीं जा सकता ।
स्कॉट एम।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.