ব্যাশে ফাইল নাম সম্প্রসারণ প্রক্রিয়া থেকে কিছু ফাইল কীভাবে বাদ দেওয়া যায়?


14

আমার রুট ডিরেক্টরিতে উবুন্টু ফাইল সিস্টেম ডিরেক্টরি রয়েছে এবং আমি ঘটনাক্রমে রুট ডিরেক্টরিতে কয়েকশো ফাইল অনুলিপি করেছি।

আমি স্বজ্ঞাতভাবে ফাইল সিস্টেমের মতো বাদ দিয়ে অনুলিপি করা ফাইলগুলি সরানোর চেষ্টা করেছি

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

এটি কাজ করে না। পুরোটি মোছার সময় কিছু ডিরেক্টরি বাদ দেওয়ার সঠিক উপায় কী?

সম্পাদনা: কী করতে হবে তা না জেনে এখানে কোনও আদেশের চেষ্টা করবেন না!


1
আপনি কোন শেল ব্যবহার করছেন? যখন এর মতো অভিনব জিনিস করার বিষয়টি আসে তখন ফাইলের নাম গ্লোববিং শেল নির্ভর।
কুসালানন্দ

2
কোনও উত্তর নয়, তবে আমি উদাহরণ হিসাবে ব্যবহার করব mc। এর মাধ্যমে সমস্ত কিছু নির্বাচন করুন *, তারপরে -বা Insertকী সহ নির্দিষ্ট ফাইলগুলি অনির্বাচিত করুন ।
pbm

1
'এমসি' কী তা আপনি ব্যাখ্যা করতে পারেন?
মাইকপ

@ কুসালানন্দ এটি/bin/bash
21

3
@ মাইকেপ: mcহ'ল মিডনাইট কমান্ডার, নর্টন কমান্ডারের খুব দরকারী অনুকরণ। এটি একটি টার্মিনালে চলে। (মিডনাইট কমান্ডার এবং নর্টন কমান্ডার উভয়ই অর্থোডক্স ফাইল ম্যানেজার নামে পরিচিত যার উদাহরণ ।)
আলেক্সপ

উত্তর:


21

যেহেতু আপনি ব্যবহার করছেন bash:

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

আমি echoকমান্ড লাইনের শুরুতে যুক্ত করার পরামর্শ দিচ্ছি যখন আপনি এমন কোনও কিছু চালাচ্ছেন যা সম্ভাব্যভাবে পুরো সিস্টেমটিকে ফুটিয়ে তুলতে পারে। আপনি যদি ফলাফলটিতে খুশি হন তবে এটি সরান।

দ্রষ্টব্য: উপরের কমান্ডটি লুকানো ফাইলগুলি মুছে ফেলবে না (যাদের নামটি একটি বিন্দু দিয়ে শুরু হয়)। আপনি যদি সেগুলিও মুছে ফেলতে চান তবে এছাড়াও dotglobবিকল্পটি সক্রিয় করুন :

shopt -s dotglob

আমি এটি সফলভাবে ফাইল সিস্টেম পরিষ্কার করতে ব্যবহার করেছি। প্রথমে আমি এটি একটি ডিরেক্টরিতে পরীক্ষা করেছিলাম। আমি rm -rf ./!(bin,sbin,..)কমা বিচ্ছিন্ন করার চেষ্টাও করেছি , তবে এটি সমস্ত ডিরেক্টরি সরিয়ে ফেলে।
কেনে

ওটা কি !(...)সিনট্যাক্সটা কি? উদাহরণ থেকে আমি স্বজ্ঞাতভাবে ভেবেছিলাম ls ./!(*/)কেবল ফাইলগুলির তালিকা তৈরি করা হবে তবে এটি সেভাবে কাজ করে না।
giyti

@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/\;

যদি, ফাইলগুলি ছাড়াও, আপনার কাছে ডিরেক্টরিগুলিও রয়েছে যা আপনি ফাইল সিস্টেমের মূলের সাথে যুক্ত করেছেন, এটি একটি স্বয়ংক্রিয় বা এলএসবি ডিরেক্টরিগুলি বাদ দিয়ে স্বয়ংক্রিয়ভাবে তৈরি করা যেতে পারে mvবা rmসত্যই, যেহেতু আমরা খালি জিনিসগুলি পরিষ্কার করার সাথে কাজ করছি ফাইল সিস্টেমের মূল, আমি আপনাকে দৃ strongly়ভাবে পরামর্শ দিচ্ছি যে আপনি যদি এটি সম্ভব হয় তবে ম্যানুয়ালি করে এটি বিবেচনা করুন।

যদি এটি সম্ভব না হয় তবে এর মতো কিছু কৌশলটি করতে পারে:

#!/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] /


আপনার সমাধানটি কেবল ফাইলগুলি মুছে দেয় তবে চারপাশে ফোল্ডার রয়েছে।
কেনে

1
খুব বেশিবার, আমি দুর্বল-লক্ষ্য নিয়ে হতাশার শব্দ শুনেছি rm। সঙ্গে একটি স্ক্রিপ্ট ভালো লেগেছে rm -fr $somepath/সঙ্গে somepathএটা uninitialized। আমি কতটা মারাত্মক তা প্রকাশে আরও এগিয়ে যেতে পারতাম, তবে আমার উপদেশে পারিবারিক বন্ধুত্বপূর্ণ থাকতে বেছে নিয়েছি।
ডোপঘোটি

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

উপরের কাট কমান্ডে, সঠিক পরিমাণ কিনা তা নিশ্চিত করার জন্য প্রথমে আপনার আইনের তালিকাটি পরীক্ষা করে দেখুন check

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.