मैं केवल कुछ निर्दिष्ट फ़ाइलों को छोड़कर किसी फ़ोल्डर में सभी फ़ाइलों को कैसे निकालूं?


11

मैं केवल कुछ निर्दिष्ट फ़ाइलों को छोड़ते हुए एक निर्देशिका में सभी फ़ाइलों को निकालना चाहता हूं, उनके पास नाम से कुछ भी नहीं है। मैं इसे कैसे हासिल कर सकता हूं?

उदाहरण के लिए, फ़ाइल नाम जिन्हें मैं रखना चाहता हूं वे हैं:

file_1.png, another_file.jpg,some_music.mp3

जवाबों:


15

यदि आप बैश का उपयोग कर रहे हैं:

shopt -s extglob
rm -- !(file1|file2|file3)

पहली पंक्ति सिर्फ विस्तारित पैटर्न मिलान को सक्रिय करती है, और उसके बाद हम उनमें से एक का उपयोग करते हैं:

!(pattern-list) दिए गए पैटर्न में से एक को छोड़कर कुछ भी मेल खाता है

और पैटर्न-सूची एक या एक से अलग पैटर्न की सूची है |


या के साथ zsh

setopt extendedglob
rm -- ^(file1|file2)

या, अधिक पोर्टेबल, का उपयोग कर find:

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

3
वैकल्पिक शेल व्यवहार वापस कैसे करें ( shopt -u extglob) को शामिल करना उपयोगी हो सकता है ।
गेदेवेद्या

7

एक उपनिर्देशिका बनाएं tmp, उन सभी फाइलों को स्थानांतरित करें जिन्हें आप उस निर्देशिका में रखना चाहते हैं और rm -f *बाद में करें। यह tmpनिर्देशिका को प्रभावित नहीं करेगा ।

उसके बाद बस करो:

mv tmp/* .
rmdir tmp

(आपके द्वारा स्थानांतरित फ़ाइलों में से कोई भी एक डॉट के साथ शुरू होता है)।

यह उन कुछ मामलों में से एक है जहां माउस और एक फाइल ब्राउज़र जैसे Nautilus का उपयोग करना समझ में आता है जहाँ आप वास्तव में उन Ctrlकुछ फ़ाइलों को क्लिक कर सकते हैं जिन्हें आप रखना चाहते हैं और फिर मेनू का उपयोग करें: Edit -> Invert Selectionअन्य फ़ाइलों को प्राप्त करने के लिए और फिर उन्हें हटा दें ।


tmp निर्देशिका के लिए चलती फ़ाइलें अच्छा लगता है। वैसे भी, मुझे यह कमांड लाइन के साथ करना है। धन्यवाद!
अगेम्प्लेयर

3
@AwQiruiGuo tmp में यह लाभ है कि यह पहले फ़ाइलों को दो सेटों में अलग कर देता है, इससे पहले कि आप जो नहीं चाहते हैं उसे हटा दें। इसलिए आप यह lsदेखने के लिए कि क्या आप उन फ़ाइलों को याद नहीं कर सकते हैं जिन्हें आप संरक्षित करना चाहते हैं।
एंथन

2

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

यदि आपकी निर्देशिका का नाम फू है और फ़ाइल का नाम बार है , तो निम्न कार्य करें।

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

यह निम्न कार्य करता है:

  1. find -type fफू और उसकी उपनिर्देशिकाओं में सभी फाइलों के नामों की खोज करता है और उन्हें STDOUT में प्रिंट करता है। विकल्प के साथ -print0यह NUL बाइट्स के साथ फ़ाइलनाम को परिसीमित करता है।
  2. grep -v -f barबार में एक पंक्ति से मेल खाने वाले सभी फ़ाइलनामों को बाहर करता है । विकल्प के साथ -zयह अपने इनपुट को एनयूएल बाइट द्वारा सीमांकित लाइनों के एक सेट के रूप में मानता है, विकल्प के साथ -Zयह एनयूएल बाइट के साथ अपने आउटपुट का परिसीमन करता है।
  3. xargs rmrmफ़ाइलों को हटाने के लिए बार-बार कॉल करता है। विकल्प के साथ -0यह अपने इनपुट को एनयूएल बाइट द्वारा सीमांकित लाइनों के एक सेट के रूप में मानता है।

यह सफेद स्थान वाले फ़ाइलनाम के साथ काम करता है।


यह काम नहीं करेगा क्योंकि फ़ाइल नाम उन में नई भूमिकाएँ हो सकता है।
एंथन

@ एंथन ने खोज के विकल्पों को बदल दिया, grep, xargs को व्हाट्सएप के साथ फिल्माए जाने का सामना करना पड़ा, जिसमें न्यूलाइन भी शामिल है
Mathias Weidner

आप उपयोग करना चाहते हैं findमैं नहीं बल्कि करना होगाfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.