कैसे बैश में फ़ाइल नाम विस्तार तंत्र से कुछ फ़ाइलों को बाहर करने के लिए?


14

मेरे पास रूट निर्देशिका में ubuntu फ़ाइल सिस्टम निर्देशिकाएं हैं और मैंने गलती से सैकड़ों फाइलों को रूट निर्देशिका में कॉपी किया है।

मैंने सहजता से फ़ाइल सिस्टम को छोड़कर कॉपी की गई फ़ाइलों को निकालने का प्रयास किया

rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./.

यह काम नहीं करता है संपूर्ण हटाने के दौरान कुछ निर्देशिकाओं को बाहर करने का उचित तरीका क्या है?

संपादित करें: कभी भी यह जानने की कोशिश किए बिना कि यहां कोई भी आदेश नहीं है!


1
आप किस खोल का उपयोग कर रहे हैं? फिल्नाम ग्लोबिंग शेल पर निर्भर है जब यह उस तरह के फैंसी सामान करने की बात आती है।
Kusalananda

2
उत्तर नहीं है, लेकिन मैं उदाहरण के लिए उपयोग करूंगा mc। के साथ सब कुछ का चयन करें *, फिर विशिष्ट फ़ाइलों के साथ -या Insertकुंजी का चयन रद्द करें ।
pbm

1
क्या आप बता सकते हैं कि 'एमसी' क्या है?
माइक

@Kusalananda यह/bin/bash
kenn

3
@ माइक: mcमिडनाइट कमांडर, नॉर्टन कमांडर की एक बहुत ही उपयोगी नकल है। यह एक टर्मिनल में चलता है। (दोनों मिडनाइट कमांडर और नॉर्टन कमांडर एक रूढ़िवादी फ़ाइल प्रबंधक कहे जाने के उदाहरण हैं ।)
एलेक्स

जवाबों:


21

चूंकि आप उपयोग कर रहे हैं bash:

shopt -s extglob
echo rm -rf ./!(bin|sbin|usr|...)

मैं echoकमांड लाइन की शुरुआत में जोड़ने की सलाह देता हूं जब आप कुछ ऐसा चला रहे होते हैं जो संभावित रूप से पूरे सिस्टम को उड़ा सकता है। यदि आप परिणाम से खुश हैं तो इसे हटा दें।

नोट: उपरोक्त कमांड छिपी हुई फ़ाइलों को नहीं हटाएगा (जो नाम डॉट से शुरू होते हैं)। यदि आप उन्हें हटाना चाहते हैं तो सक्रिय भी करें dotglobविकल्प:

shopt -s dotglob

मैंने इसका उपयोग फाइलसिस्टम को सफलतापूर्वक साफ करने के लिए किया। सबसे पहले मैंने इसे एक डायरेक्टरी में टेस्ट किया। मैंने भी rm -rf ./!(bin,sbin,..)अल्पविराम की कोशिश की , लेकिन यह सभी निर्देशिकाओं को हटा देता है।
कीन

वह !(...)वाक्य रचना क्या है ? उदाहरण से मैंने सहज रूप से सोचा था ls ./!(*/)कि केवल फाइलों को सूचीबद्ध किया जाएगा, लेकिन यह उस तरह से काम नहीं करता है।
जियुति '

@giusti यह सिंटैक्स फ़ाइल नाम विस्तार तंत्र में मेल खाने वाला पैटर्न है - आपको इसका विवरण पाथनाम एक्सपेंशन चैप्टर के तहत बाश मैनुअल में मिलेगा। इसका उपयोग फ़ाइलों के प्रकारों को, केवल नामों को, जैसे स्टार *या अन्य ग्लब्स को बाहर करने के लिए नहीं किया जा सकता है ।
जिमीज

12

यह आदेश सभी गैर-निर्देशिका को दिखाएगा /:

find / -maxdepth 1 -type f

एक बार जब आप पूरी तरह से सुनिश्चित हो जाते हैं कि कोई फाइल नहीं है जिसे आप रखना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

find / -maxdepth 1 -type f -delete

सुरक्षित करें, यह सुनिश्चित करने के लिए उन्हें कहीं और स्थानांतरित करना होगा कि आप कुछ संरक्षित नहीं कर रहे हैं जिसे आप संरक्षित करना चाहते हैं:

mkdir /root/preserve
find / -maxdepth 1 -type f -exec mv -- "{}" /root/preserve/\;

यदि, फ़ाइलों के अलावा, आपके पास निर्देशिकाएँ भी हैं जिन्हें आपने फाइल सिस्टम के रूट में जोड़ दिया है, तो यह एलएसबी निर्देशिकाओं को एक स्वचालित या , लेकिन ईमानदारी से छोड़कर, स्वचालित हो सकती है , क्योंकि हम शुद्ध चीजों के साथ काम कर रहे हैं। फाइलसिस्टम की जड़, मैं दृढ़ता से सुझाव दूंगा कि आप इसे मैन्युअल रूप से करने पर विचार करें यदि सभी संभव हो।mvrm

यदि यह संभव नहीं है, तो कुछ इस तरह की चाल हो सकती है:

#!/bin/bash
declare -a excludes
for item in root sys 'lost+found' mnt home proc etc opt boot lib lib64 libx32 sbin media srv dev var usr bin tmp run; do
    excludes+=("$item")
done
if ! [[ -d /root/preserve ]]; then
    mkdir -p /root/preserve
fi
IFS="\n"
for item in find / -type d -maxdepth 1; do
    really=true
    for exclude in ${excludes[@]}; do
        if [[ "$exclude" == "${item#/}" ]]; then
            really=false
        fi
    done
    if [[ "true" == "$really" ]]; then
        mv -- "$item" /root/preserve/
    fi
done

एक बार जब आप चीख परीक्षा पास कर लेते हैं (यानी आपका सिस्टम अभी भी चलता है और आप पीड़ा में नहीं चिल्ला रहे हैं), आप की सामग्री को हटा सकते हैं /root/preserve/

महत्वपूर्ण नोट: आप जो कुछ भी करते हैं, उसके बारे में कोई भी क्रम चलाने के बारे में भी नहीं सोचते rm -fr [ANYTHING GOES HERE] /


आपका समाधान केवल फ़ाइलों को हटाता है, लेकिन चारों ओर फ़ोल्डर भी हैं।
Kenn

1
एक भी कई बार, मैं एक खराब उद्देश्य से निराशा के चीखना सुना है rm। जैसे स्क्रिप्ट के साथ rm -fr $somepath/इसमें somepathअनइंस्टाल्यूट होता है। मैं इस बात को व्यक्त करने में आगे बढ़ सकता हूं कि यह कितना गंभीर है, लेकिन अपने आराध्य में परिवार के अनुकूल रहने का विकल्प चुना।
डोपघोटी

3

यह काम किया जाना चाहिए (हालांकि ओपी पूछता है उसी तरह नहीं):

ls -1 >1.txt
pico 1.txt 

उन सभी फाइलों / निर्देशिकाओं को हटा दें जिन्हें आप रखना चाहते हैं

xargs rm < 1.txt

यदि आपकी फ़ाइलों में सभी का समान नाम प्रारूप, दिनांक, या कुछ और है, तो अन्य विधियाँ हैं।

मैं इनोड्स को देखूंगा - और देखूंगा कि क्या वे ls -i के माध्यम से अनुक्रमिक हैं ? फिर उपरोक्त प्रक्रिया के समान प्रकार का उपयोग करते हुए ...

ls -iF1 | sort |cut -c10- | grep -vE "\/|\@" >i.txt   #This part removes entries that are not regular files, such as directories and links.  
pico i.txt
xargs rm < i.txt

ऊपर दिए गए कट कमांड में, यह सुनिश्चित करने के लिए कि यह सही राशि है, पहले अपनी इनकोड सूची देखें।

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