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


मुझे निर्देशिका में सभी फाइलों को हटाने की जरूरत है, लेकिन उनमें से कुछ को बाहर कर दें। उदाहरण के लिए, फ़ाइलों के साथ एक निर्देशिका में a b c ... z, मुझे छोड़कर सभी को हटाना होगा u तथा p। क्या इसे करने का कोई आसान तरीका है?


119
2018-01-08 12:17


मूल


नीचे दिए गए उत्तरों बहुत बेहतर हैं, लेकिन आप फ़ाइलों को केवल पढ़ने के लिए ही सहेज सकते हैं, सभी को हटा सकते हैं, और फिर उन्हें अपनी मूल अनुमतियों में बदल सकते हैं (जब तक आप आरएम-एफ का उपयोग नहीं करते)। आपको यह जानना होगा कि कौन से अनुमतियों को पुनर्स्थापित करना है और आपको यह जानना होगा कि प्रक्रिया के दौरान उन्हें कुछ भी लिखना आवश्यक नहीं है। यही कारण है कि अन्य उत्तरों बेहतर हैं। - Joe
यदि आप छिपी हुई फाइलों को भी हटाना चाहते हैं shopt -s dotglob दौड़ने से पहले rm (...)।


जवाब:


मैं उन मामलों में क्या करना है टाइप करना है

rm *

तब मैं दबाता हूं Ctrl+एक्स,* सेवा मेरे विस्तार  * सभी दृश्य फ़ाइल नामों में।

तो मैं सिर्फ दो फाइलों को हटा सकता हूं जिन्हें मैं सूची से रखना चाहता हूं और अंत में कमांड लाइन निष्पादित करता हूं।


108
2018-01-08 12:18



मुझे लगता है कि यह केवल तब तक काम करता है जब तक फाइलों की सूची * विस्तार भी बहुत लंबा नहीं हो रहा है। : -} - Frerich Raabe
एएससी के बाद * * * "का विस्तार भी करेगा। - slowpoison
@ संतोषकुमार: यह मुझे समझ में नहीं आता है। विस्तार हमेशा काम करेगा, यह इस बात पर निर्भर नहीं करता कि आप किस आदेश का उपयोग करना चाहते हैं। - Der Hochstapler
@ ओलिवर साल्ज़बर्ग क्षमा करें, संयोजन थोड़ा उलझन में है। मुझे लगता है कि आपको लिखना चाहिए Ctrl + Shift + x + * - Santosh Kumar
@ संतोषकुमार: लेकिन यह संयोजन नहीं है। - Der Hochstapler


सेवा मेरे rm सब लकिन u,p बैश में बस टाइप करें:

rm !(u|p)

इसके लिए निम्न विकल्प सेट करने की आवश्यकता है:

shopt -s extglob

और देखें: ग्लोब - ग्रेग की विकी


143
2018-01-08 12:34



आपके पास 'extglobbing' सक्रिय होना चाहिए: shopt -s extglob - sparkie
आपको shopt -s extglob, @एक दृश्य। साथ ही, यह सिर्फ फाइलें हैं, निर्देशिका नहीं, इसलिए मैंने इसे हटा दिया है -rf आपके आदेश में विकल्प। - slhck
अगर आपको एक फाइल को बाहर करने की जरूरत है एक चयन के फाइलों के, इसे आज़माएं: rm !(index).html। यह "index.html" के अपवाद के साथ ".html" में समाप्त होने वाली सभी फ़ाइलों को हटा देगा। - mzuther


आप उपयोग कर सकते हैं find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! अगली अभिव्यक्ति को अस्वीकार करता है
  • -name एक फ़ाइल नाम निर्दिष्ट करता है
  • -maxdepth 1 केवल निर्दिष्ट निर्देशिका को संसाधित करेगा (find डिफ़ॉल्ट ट्रैवर्स निर्देशिका द्वारा)
  • -type f केवल फाइलों को संसाधित करेगा (और उदाहरण निर्देशिका के लिए नहीं)
  • -delete फाइलों को हटा देगा

फिर आप देख रहे स्थितियों को ट्यून कर सकते हैं खोजने के मैन पेज

अद्यतन करें

  • ध्यान रखें कि अभिव्यक्ति के तत्वों का क्रम महत्वपूर्ण है (दस्तावेज़ीकरण देखें)
  • उपयोग करके पहले अपने आदेश का परीक्षण करें -print के बजाय -delete

    find . ! -name u ! -name p -maxdepth 1 -type f -print
    

68
2018-01-08 12:35



@ डेनिस धन्यवाद मैंने जवाब अपडेट किया - Matteo
भविष्यवाणियों का क्रम यहां महत्वपूर्ण है। अगर कोई डाल दिया -delete तुरंत बाद . यह आपदा होगी (सीडब्ल्यूडी में सभी फाइलों को हटा देगा) - Michał Šrajer
इसे और अधिक कॉम्पैक्टली के रूप में लिखा जा सकता है find . -maxdepth 1 -type f -name '[^up]' -delete - kojiro
@kojiro हाँ लेकिन केवल उन फ़ाइलों के लिए जो केवल एक अक्षर हैं। अधिक जटिल नामों के साथ रेगेक्स एक गड़बड़ हो सकती है। - Matteo
find मेरा सबसे अच्छा दोस्त है, खासकर जब ग्लोब करने के लिए बहुत सारी फाइलें हैं - Terence Johnson


सरल:

mv एक ऊपरी निर्देशिका में आप चाहते हैं कि फाइलें, rm निर्देशिका और फिर mv उन्हें वापस।


42
2018-01-08 12:22



Offcourse, उन्हें एक निर्देशिका में एमवी उच्च। उन्हें उन उपनिर्देशिका में एमवी करने की कोशिश न करें जिन्हें आप हटा रहे हैं ... - Konerak
@Konerak: rm के बिना -r उपनिर्देशिका को हटा नहीं पाएगा। - reinierpost
यह गंतव्य निर्देशिका में समान नाम वाली फ़ाइलों को ओवरराइट करेगा - Matteo
मैं इसे कम कर रहा हूं क्योंकि यह आसान हो सकता है, यह गैर-परमाणु है और कम समय के दौरान निर्देशिका से सभी फ़ाइलों को प्रभावी ढंग से हटा देता है; यह स्वीकार्य नहीं होगा अगर, उदाहरण के लिए, फ़ाइलों को नेटवर्क पर साझा किया जा रहा है। - sam hocevar


कुछ हद तक समान है यह जवाब लेकिन जहां तक ​​मुझे पता है कि "प्राचीन" कार्यक्षमता किसी भी (अस्पष्ट) / bin / sh जैसा दिखता है (उदाहरण के लिए bash, zsh, ksh, आदि) द्वारा समर्थित कोई विशेष विकल्प आवश्यक नहीं है,

rm [^up]

15
2018-01-08 14:22



यह 1-चार फ़ाइल नामों के लिए काम करता है। लंबे नामों के लिए, स्पार्की का जवाब बेहतर है। - glenn jackman
क्या गलत होगा rm [^up]*? मैं अक्सर समान चीजें करता हूं। - α CVn
@ माइकल Kjörling - यह यू या पी के साथ शुरू होने वाली सभी फाइलों को हटा देगा, न केवल उन नामों वाले जिन्हें आप और पी। मुझे लगता है कि ओपी (@ एशॉट) का मतलब ए-जेड और यू, पी, आदि था। प्रतीकात्मक रूप से और सचमुच नहीं। - Sudipta Chatterjee
@HobbesofCalvin कि सभी फाइलों को हटा देगा नहीं आप या पी से शुरू, उनके साथ शुरू नहीं। - rjmunro
@rjmunro - धन्यवाद, उसको याद किया! :) - Sudipta Chatterjee


बिना खोज किए इसे करना:

ls | grep -v '(u|p)' | xargs rm

(संपादित करें: "यू" और "वी", जैसा कि यहां अन्य स्थानों में, पूरे regexes के सामान्य संस्करण के रूप में उपयोग किया जा रहा है। जाहिर है आप बहुत सारी चीजों से मेल खाने से बचने के लिए अपने regexes एंकर करने के लिए सावधान रहना चाहेंगे।)

यदि आप दूसरों ने सुझाव दिया है, तो आप निश्चित रूप से एक स्क्रिप्ट चाहते हैं यदि आप इनमें से अधिक कुछ करने जा रहे हैं।


11
2018-01-09 03:54



grep डिफ़ॉल्ट रूप से विस्तारित regexpt संभाल नहीं होगा: या तो उपयोग करें -E या egrep - Matteo
यह किसी भी फाइल को बाहर कर देगा u या ए p - Matteo
@Matteo नहीं यह नहीं होगा। Grep फ़ाइलों को grepping नहीं है, यह ls कमांड के आउटपुट grepping है। आप कुछ ऐसा सोच रहे हैं grep -L (u|p)' * | xargs rm कहा पे -L मतलब सूची फ़ाइल नामों में एक मैच नहीं है। - rjmunro
ओह, आपका मतलब है कि किसी भी फ़ाइल का नाम है u या p, कोई फ़ाइल नहीं है u या ए p। वह सही है। आप इसका उपयोग करके ठीक कर सकते हैं egrep -v '^(u|p)$' - rjmunro
इन मैचों को छोड़कर सबकुछ हटा दिया गया है! ls | grep -v 'vuze\|progs' | xargs rm -rf - Nick


Zsh में:

setopt extended_glob  # probably in your .zshrc

फिर

rm ^(u|p)

या

rm *~(u|p)

दूसरा आपके पास काम करेगा, भले ही आपके पास हो ^ में $histchars इतिहास प्रतिस्थापन के लिए, और निश्चित रूप से आप इससे पहले एक मनमाना ग्लोब डाल सकते हैं ~


6
2018-01-09 22:34





ग्लोबिनोर एक कोलन से अलग सूची लेता है

GLOBIGNORE=u:p
rm *

5
2018-01-08 16:32



यह मेरे खोल पर काम नहीं करता है (जीएनयू बैश 4.1.5 (1))। पहले इसे थोड़ा कम हानिकारक कुछ के साथ परीक्षण करना सुनिश्चित करें rm या एक परीक्षण निर्देशिका में! - α CVn


फ्लॉपी युग में वापस मेरे पास "एक्सेप्ट" नामक एक डॉस निष्पादन योग्य था जो वर्तमान निर्देशिका से अस्थायी रूप से चीजों को स्थानांतरित कर देगा और कमांड निष्पादित करेगा, ताकि आप कह सकें:

* .txt डेल * को छोड़कर *। *

सब कुछ हटाने के लिए लेकिन अपनी पाठ फाइलें।

शेल स्क्रिप्ट के रूप में लागू करने के लिए यह एक बहुत ही छोटी बात होगी और यदि यह ऐसी चीज है जो आपको दो गुना से अधिक करने की संभावना है तो ऐसा लगता है कि यह एक अच्छा विचार होगा।


3
2018-01-08 17:02



यह मुझे एक ही चीज़ याद दिलाता है। लेकिन अस्थायी रूप से फ़ोल्डर से बाहर निकलना मल्टीटास्किंग के युग में एक अच्छा विचार नहीं हो सकता है :) - Sedat Kapanoglu