मैं grep को ls कैसे पाइप करूं, और grep द्वारा फ़िल्टर की गई फ़ाइलों को हटा दें?


33

मैं अपने होम फ़ाइल में कुछ पैकेज हटाना चाहता था, लेकिन फ़ाइल नाम बहुत लंबा था ( google-chrome-stable_current_i386.deb)। इसलिए, मैंने ls|grep chrome|rmक्रोम फाइल को फ़िल्टर करने के लिए grep में फ़ाइलों को पाइप करने के लिए कमांड का उपयोग करने का फैसला किया , और फिर इसे हटा दिया। यह काम नहीं किया, इसलिए मैं यह देखना चाहता हूं कि मैं यह कैसे कर सकता हूं।


22
rm -i *chrome*.deb
लैम्बर्ट

28
आम तौर पर बोलना मुझे नापसंद होता है जब लोग "जवाब नहीं देते हैं" जवाब देते हैं, लेकिन यह एक एक्सवाई समस्या का सबसे अच्छा उदाहरण है जो मैंने कभी देखा है। आपका असली सवाल "कैसे मैं जल्दी से पूरी बात बाहर लिखे बिना, एक लंबे फ़ाइल नाम के साथ एक फ़ाइल को नष्ट करना" है, और वहाँ अच्छा बहुत से तरीके से उत्पादन grepping शामिल नहीं है कर रहे हैंls
माइकल Mrozek

5
बस उपयोग find- find . -name "*chrome*" -delete
बोरिस स्पाइडर


3
एक StackExchange उपयोगकर्ता के रूप में मेरे दो सेंट: भविष्य में, आपने जो भी कोशिश की है उसके बारे में विवरण प्रदान करते हुए अपने प्रश्न को अधिक सामान्य तरीके से पूछें। "फ़ाइल नाम में एक निश्चित स्ट्रिंग के साथ फ़ोल्डर में किसी भी फाइल को कैसे हटाऊं?" यह वाक्यांश के लिए एक बेहतर तरीका हो सकता है। तो आप बस एक तरफ, के रूप में जोड़ सकते हैं, कि आप के lsमाध्यम grepसे पाइपिंग की कोशिश की, rmलेकिन यह काम करने के लिए नहीं मिल सका। इस तरह आपको एक अयोग्य समाधान के बारे में एक अच्छा जवाब देने के लिए किसी को मजबूर करने के बजाय अपने कार्य को पूरा करने के लिए "सही" या "सबसे आसान" तरीके के बारे में एक या दो अच्छे उत्तर मिलेंगे।
एड्रियन

जवाबों:


56

यह लगभग मुझे विंस बना दिया।

  1. आप अपने पैर में उस बन्दूक को इंगित करना बंद करना चाह सकते हैं । मूल रूप से किसी भी तरह की पार्सिंग स्थापित या ग्लब्स जैसे स्थापित तरीकों की तुलना में lsअधिक जटिल और त्रुटि-प्रवण होने वाली है ।find [...] -exec
  2. जब तक किसी ने आपके लिए ट्रोल डिस्ट्रो स्थापित नहीं किया, तब तक आपका शेल Tabपूरा हो चुका है । बस टाइप करें rm googleऔर दबाएँ Tab। यदि यह तुरंत पूरा नहीं होता है, तो Tabमिलान करने वाली फ़ाइलों की सूची देखने के लिए फिर से दबाएं । फ़ाइल नाम के अधिक वर्णों को टाइप करें ताकि वह पूरा न हो जाए, फिर कमांड को चलाएं।
  3. पाइप्स ! = पैरामीटर । मानक इनपुट एक बाइनरी डेटा स्ट्रीम है जो कि एसिंक्रोनस रूप से एक कमांड को खिलाया जा सकता है। पैरामीटर अंतरिक्ष से अलग तार होते हैं जिन्हें एक बार और केवल एक बार इसे चलाने पर एक कमांड में पारित किया जाता है। ये बहुत कम विनिमेय हैं।

1
क्षमा करें यदि यह एक n00b प्रश्न की तरह लग रहा था। मुझे पता था कि आम तौर पर इसका उपयोग करना ठीक था, क्योंकि कहा गया पैकेज एकमात्र पैकेज था जिसमें "क्रोम" कहा गया था। इसलिए, grep का उपयोग करके केवल एक फ़ाइल को फ़िल्टर किया जाएगा। मैं linux के लिए बहुत नया हूँ, और मैं पहले से ही बहुत सारी bash स्क्रिप्ट कर चुका हूँ, लेकिन मुझे अभी तक सब कुछ पता नहीं है: P। हर्ष, दोस्त।
स्पेशलबॉम्ब

5
कठोर होने का मतलब यह नहीं था, लेकिन शेल एक कठोर और अक्षम वातावरण है, जो थोड़े उपयोगकर्ता के अनुकूल सतह के पीछे छिपा हुआ है। चीजों को सुरक्षित रूप से करना काफी मुश्किल है, कभी भी सुरक्षित रूप से या सही ढंग से दिमाग न लगाएं
l0b0

2
@ स्पेशलबॉम्ब यह एकमात्र सही उत्तर है। यह बताते हुए कि सही तरीके से कहा गया कि शॉटगन किसी के पैर को साफ करने के लिए, जैसा कि अन्य जवाब देते हैं, निश्चित रूप से जाने का रास्ता नहीं है। आँख बंद करके अमल करने के लिए विशेष रूप से सावधान रहें rm- यह आपके डिस्ट्रो फ्राई करने का शायद सबसे आम तरीका है।
बोरिस स्पाइडर

@BoristheSpider हेह, मैं निश्चित रूप से पहले से ही उबंटू को दो बार एएमडी ग्राफिक्स कार्ड ड्राइवरों को स्थापित कर रहा हूं। मैंने पहले से ही इस बारे में एक सवाल पूछा था। एएमडी भयानक रहा है, इसलिए मैंने पूछा कि क्या एएमडी कार्ड पर लिनक्स के साथ कोई सामान्य सुधार या गेमिंग के बेहतर तरीके थे।
स्पेशलबॉम्ब

34

आप वाइल्डकार्ड के साथ खोज कमांड का उपयोग भी कर सकते हैं:

find . -maxdepth 1 -name '*chrome*' -delete

ध्यान दें कि "-maxdepth" तर्क यह सुनिश्चित करता है कि केवल वर्तमान निर्देशिका में काम करता है, और उपनिर्देशिकाओं में पुनरावृत्ति नहीं करता है।


1
सुधार के लिए सुझाव: (क) उपयोग -inameकरने के लिए केस-संवेदी फ़ाइल नाम (ख) पाइप के लिए xargsका उपयोग कर -print0के लिए झंडा findऔर -0के लिए झंडा xargsxargsआपको "इंटरेक्टिव" (पुष्टि हटाएं foo?) जैसी चीजों को हटाने की अनुमति देता है।
क्रिस्टोफर शुल्त्स

3
यदि आप -exec विकल्प का उपयोग करते हैं तो xargs को पाइप करने की आवश्यकता नहीं है:find . -name '*chrome*' -exec rm -i {} +
जॉनी

4
क्या यह भी उपनिर्देशिकाओं में पुनरावर्ती नहीं हटाएगा? आपको निर्दिष्ट maxdepthकरने की आवश्यकता हो सकती है 1.
Tyzoid

32

आपके पास सही विचार था, बस कुछ विवरण छूट गए। चूंकि आप एसटीडीआईएन में आने वाली सूची के साथ काम कर रहे हैं और rmमापदंडों की अपेक्षा करते हैं, इसलिए आपको उपयोग करने की आवश्यकता है xargs

इस प्रकार:

ls | grep chrome | xargs rm

आपको जो चाहिए वो देना चाहिए।

ध्यान दें कि यदि आप के अलावा अन्य सब कुछ को नष्ट करना चाहते chromeफ़ाइल, तो आप बस जोड़ सकते हैं -vकरने के लिए grepबयान।

ध्यान दें कि, इस प्रश्न के अन्य उत्तरों के अनुसार, यह संभवतः पूरा करने का एक बुरा तरीका है जिसे आप पूरा करना चाहते हैं।


इसके साथ -v, यह मेल खाने वाली फ़ाइलों को छोड़कर सब कुछ नहीं हटाएगा chrome? मुझे नहीं लगता कि ओपी चाहता है ...
akivajgordon

फिर से देख रहे हैं, आप सही हैं। ओपी "क्रोम फ़ाइल को फ़िल्टर करना" चाहता है, लेकिन फिर इसे निकालना चाहता है।
जॉन

यह एक सरल "आरएम-आई क्रोम " की तुलना में अनावश्यक रूप से जटिल लगता है
chander

5
स्वीकृत उत्तर काम करता है, लेकिन नीचे दिए गए उत्तर को देखें जो बताता है कि यह एक बुरा विचार क्यों है। (इस टिप्पणी को केवल उन लोगों के लिए पोस्ट कर रहा हूं जो "स्वीकार" चेकमार्क देखते ही रुक जाते हैं।)
जिम डेविस

1
यह, स्वीकृत उत्तर "काम करता है" केवल अगरls आउटपुट में "अजीब" फ़ाइलनाम नहीं हैं । रिक्त स्थान वाले फ़ाइलनाम इसे मिटा देंगे। यह भी खतरनाक है अगर कोई उस निर्देशिका में विशेष सॉस के साथ फ़ाइल नाम का निर्माण कर सकता है जहां आप इसे चलाते हैं। जैसा कि एक से अधिक व्यक्ति पहले ही बता चुके हैं, ls के आउटपुट को पार्स न करें !
स्टीफन पी

11

कभी भी ls के आउटपुट को पार्स न करें
मेरा सुझाव है कि ls [ 1 ] के आउटपुट को पार्स करने से बचें , भले ही delकमांड के साथ संयोजन में । यह कई कारणों से मुख्य रूप से अप्रत्याशित और सामान्य रूप से संबंधित नहीं है जो फ़ाइल नाम में अनुमत हैं।

यहां तक ​​कि जब आपको उम्मीद करनी चाहिए कि लिनक्स पैकेज से संबंधित फाइलनाम "अच्छा व्यवहार करेंगे " , तो यह समस्या फिर भी दिखाई दे सकती है यदि अन्य फाइलें उसी निर्देशिका में मौजूद हैं, लेकिन आपको पता नहीं था या नोटिस नहीं किया गया था।

इसका उपयोग करना बेहतर है find, टैब विस्तार (नाम और प्रेस लिखना शुरू करें Tab), फ़ाइल नाम विस्तार [ 2 ] के रूप में *MyKey*...


एक तेज़ समाधान
चूंकि आप सभी पैकेजों का चयन करना चाहते हैं (जो कि "google" के.deb साथ समाप्त होते हैं ) आप वाइल्डकार्ड के साथ अपना अनुरोध बना सकते हैं और एक सरल काम कर सकते हैं* *google*.deb

rm -i *google*.deb 

जो मध्य में "google" के साथ प्रत्येक फ़ाइल नाम का चयन करेगा जो वर्तमान निर्देशिका में वर्तमान के लिए समाप्त होगा । विकल्प (इंटरैक्टिव) पुष्टिकरण के लिए संकेत देगा, एक अच्छी आदत जब आप पैरामीटर विस्तार के साथ फाइलें हटाते हैं।.deb-i


आपके प्रयास के दर्शन के करीब एक समाधान
यदि आपका उद्देश्य टुकड़ा के बाद अपने कमांडलाइन टुकड़े का निर्माण करना है, तो आपने किया है ls, बाद में ls | grep google, और केवल अपने आउटपुट की जांच करने के बाद आप इसे सब-सब्मिट के $(...)साथ निष्पादित कर सकते हैं

rm -i $(ls | grep google)

एक तेज और खतरनाक तरीका [ 3 ] , का उपयोग करना है!!

ls | grep google
rm -i $(!!)

जो आपके इतिहास में समाप्त हुई अंतिम कमांड को निष्पादित करेगा । आप खुद को इस तथ्य से बचा सकते हैं कि आपके पास उस पंक्ति का कोई दृश्य नियंत्रण नहीं है जिसे आप निष्पादित करने जा रहे हैं यदि आपने पहले शेल विकल्पों को सक्षम histverifyकिया है shopt -s histverify


5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... का उपयोग करें -name '*c*.deb'या कुछ अन्य पैटर्न के बजाय आप के अनुरूप है।


2

rmसे इनपुट स्वीकार नहीं करता है stdin। आपको कुछ ऐसा करने की आवश्यकता होगीls google-chrome* | xargs rm

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