मैं linux find कमांड का उपयोग करने से फ़ाइल नाम के बजाय सामग्री कैसे प्रिंट कर सकता हूं?


10

मेरे पास ऐसी हजारों गैर-कानूनी फाइलें हैं जिनका नाम कुछ इस तरह है cbs_cdr_vou_20180624_603_126_239457.unl। मैं निम्नलिखित कमांड का उपयोग करके उन फाइलों से सभी लाइनों को प्रिंट करना चाहता था। लेकिन इसका मुझे केवल नाम देना है। मुझे फ़ाइल नामों की आवश्यकता नहीं है, मुझे केवल उन फ़ाइलों की सामग्री की आवश्यकता है।

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt

मौजूदा उत्पादन:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl

अपेक्षित उत्पादन:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;

कृपया ध्यान दें कि, कैट कमांड के लिए मुझे त्रुटि मिल रही है जैसे -bash: /bin/logger: Argument list too longकि कमांड के findबजाय उपयोग करना चाहते थे cat


आपको अभी भी उपयोग करने की आवश्यकता है cat
इग्नासियो वाज़केज़-अब्राम्स

हाँ! क्या आप मुझे बता सकते हैं कि मैं ऐसा कैसे कर सकता हूं? @ इग्नासियोवेज़ज़-एब्राम्स
रेज़ुआन

जवाबों:


28

findउपयोगिता pathnames से संबंधित है। यदि findपाया गया पथनामों के लिए कमांड में कोई विशेष कार्रवाई का उल्लेख नहीं किया गया है , तो डिफ़ॉल्ट कार्रवाई उन्हें आउटपुट करना है।

आप आदेशों को catजोड़कर , जैसे चलाए जा रहे पाथनामों पर कार्रवाई कर सकते हैं :-execfind

find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

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

आउटपुट के लिए जाना होगा /home/fifa/cbs/test.txt

सम्बंधित:


1
अपेक्षित और निष्पादन समय के रूप में काम करना बहुत तेज़ है जो वास्तव में बहुत अच्छा है। बहुत धन्यवाद।
रेज़ुआन

12

के उत्पादन में findप्रासंगिक फ़ाइल नाम के साथ परिणाम देगा।
आप |आउटपुट ( ) आउटपुट कर xargs catसकते हैं, जो catप्रत्येक फ़ाइल पर कमांड का प्रदर्शन करेगा ।

उदाहरण के लिए:

find -type f -name 'cbs_cdr_vou_20180615*.unl' | xargs cat  > /home/fifa/cbs/test.txt

एक अन्य विकल्प का उपयोग करना होगा -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt

4
आपके दोनों आदेश ठीक काम कर रहे हैं। लेकिन कुसलानंद की आज्ञा से थोड़ा धीमा । मुझे लगता है, निष्पादन का समय अलग है -exec cat {} \;और -exec -cat {} +। वैसे, बहुत बहुत धन्यवाद यारोन।
रेज़ुआन

xargs पाए गए मार्ग में रिक्त स्थान के लिए असुरक्षित है; -exec बिल्ली {} नहीं है
jez

2
find -print0 | xargs -0रिक्त स्थान / उद्धरण / आदि के लिए असुरक्षित नहीं है।
शराबी

1
@Rezuan: -exec cat {} \;उन्हें xargs की तरह एक साथ बैच करने के बजाय प्रत्येक फ़ाइल के लिए अलग से बिल्ली चलाता है। जब तक आप स्पष्ट रूप से यह नहीं चाहते हैं, तब तक इसका उपयोग न करें (जैसे कि एक कमांड जो केवल एक समय में एक फ़ाइल के लिए काम करता है), या यदि आपको बिना -exec ... +और बिना किसी सिस्टम को पोर्टेबिलिटी की आवश्यकता है -print0/ xargs -0। मैं थोड़ा आश्चर्यचकित हूं कि find|xargsयह औसत से धीमा है -exec cat {} +, हालांकि। क्या आपके पास कुल बहुत कम फाइलें हैं, इसलिए स्टार्टअप ओवरहेड बहुत अधिक लागत है? या xargsजब आपके डिस्क कैश ठंडा था तब आपने केवल संस्करण का समय दिया था?
पीटर कॉर्ड्स

1
@PeterCordes स्पष्टीकरण के लिए धन्यवाद। यह डिस्क कैश के लिए था, मुझे बाद में एहसास हुआ।
रेजुआन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.