ডিরেক্টরি থেকে কিছু বাদে সমস্ত ফাইল সরান


215

ব্যবহার করার সময় sudo rm -r, আমি কীভাবে নিম্নলিখিত ফাইলগুলি বাদ দিয়ে সমস্ত ফাইল মুছতে পারি:

textfile.txt
backup.tar.gz
script.php
database.sql
info.txt


1
2 উপায়ে এই প্রশ্ন পড়তে হয়, এবং বিদ্যমান উত্তর উভয় ব্যাখ্যা আবরণ: হয়: (ক) নির্দিষ্ট করা নামের সাথে ফাইল সংরক্ষণ সরাসরি লক্ষ্য ডিরেক্টরির মধ্যে এবং অবস্থিত - যেমন rm -rবোঝা - আর ডিলিট সবকিছু, সাব সহ - এমনকি যদি তারা নিজেদের সংযত নির্দিষ্ট নাম সহ ফাইল; বা: (খ) লক্ষ্য ডিরেক্টরিটির সম্পূর্ণ সাবট্রিকে অতিক্রম করুন এবং প্রতিটি ডিরেক্টরিতে তালিকাভুক্ত নাম ছাড়া সমস্ত ফাইল মুছুন।
এমকিলেমেন্ট 0

উত্তর:


219
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete

আপনি যদি নির্দিষ্ট না করেন তবে -type fঅনুসন্ধানগুলি ডিরেক্টরিগুলিরও তালিকাবদ্ধ করবে, যা আপনি নাও চাইতে পারেন।


বা খুব কার্যকর সমন্বয় ব্যবহার করে আরও সাধারণ সমাধান find | xargs:

find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --

উদাহরণস্বরূপ, বর্তমান ডিরেক্টরিতে থাকা সমস্ত নন টিএসটি-ফাইলগুলি মুছুন:

find . -type f -not -name '*txt' -print0 | xargs -0 rm --

print0এবং -0যদি সেখানে ফাইলের নামের যে মুছে ফেলা হবে কোনো শূণ্যস্থান আছে সমন্বয় প্রয়োজন হয়।


2
দেখে মনে হচ্ছে xargs এর একটি পাঠ্য আকারের সীমা রয়েছে
ফ্রেজরাস

26
একাধিক নিদর্শন মুছতে:find . -type f -not -name '*ignore1' -not -name '*ignore2' | xargs rm
সিউই শেন 申思维

5
ডিরেক্টরি সম্পর্কে কি? এটি সমস্ত ফাইল মুছে ফেলবে, তবে এটি কী ফোল্ডারগুলি সরিয়ে ফেলবে ?!
ওরেজভানি

31
"| Xargs আরএম" এর পরিবর্তে অনুসন্ধান করুন একটি সম্পূর্ণ-পরামিতি পরামিতি।
এমিল স্টেনস্ট্রোম

1
পরিবর্তে -print0 | xargs -0 rm --আপনি কেবল পারেন-delete
অ্যান্ডি

151
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)

এক্সটগ্লোব (বর্ধিত প্যাটার্ন ম্যাচিং) BASH এ সক্ষম করা দরকার (এটি সক্ষম না করা থাকলে):

shopt -s extglob

2
আমি "অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটি পেয়েছি '('" আমি যখন করি তখন shopt -s extglob; rm -rf !(README|LICENSE)কোনও ধারণা কেন?
ডেনিস

@nic মনে নেই, দুঃখিত। আমি সম্ভবত ব্যবহার শেষ পর্যন্ত findসঙ্গে -deleteবিকল্প।
ডেনিস

এটি আমার পক্ষে সেরা সমাধান এবং এটি আমার উবুন্টু 12.04.4 এলটিএসে শপ্টের প্রয়োজন ছাড়াই ডিফল্টরূপে কাজ করে
xian

3
@নিক, @ ডেনিস: সিনট্যাক্স ত্রুটিটি পরামর্শ দেয় যে এর চেয়ে অন্য কিছু bashব্যবহৃত হয়েছিল, যেমন dash, যেখানে extglobসমর্থিত নয়। যাইহোক, একটি ইন্টারেক্টিভ bash শেলের মধ্যে, কমান্ডটি ALSO হিসাবে বর্ণিত হিসাবে কাজ করবে না, যদিও বিভিন্ন কারণে। এর সংক্ষিপ্ততা: নিজের shopt -s extglobদ্বারা চালিত করুন; একবার সফলভাবে সক্রিয় করা (এর সাথে যাচাই করা shopt extglob), চালানো rm -rf !(README|LICENSE)। (যদিও extglobএখনও সক্ষম নয়, কমান্ড কার্যকর হওয়ার আগে ইতিহাসের সম্প্রসারণ!(...) দ্বারা মূল্যায়ন করা হয়; সম্ভবত এটি ব্যর্থ extglob
হওয়ায় NEITHER

2
@nic, @ ডেনিস, @ এমকিলেটমেন্ট 0: আমার কাছে একই সমস্যা ছিল অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটি (".sh ফাইলের মধ্যে কমান্ড কার্যকর করার সময় (#! / বিন / বাশ)) যখন আমি কমান্ডে চালাচ্ছিলাম না তখন । লাইন ইন্টারফেস এটা প্রমাণিত যে ছাড়াও shopt -s extglobকমান্ড লাইন ইন্টারফেসে রান, আমি আমার স্ক্রিপ্ট ফাইল ভিতরে এটা পুন: প্রকাশ ছিল এটি আমার জন্য সমস্যার সমাধান।।
Ahresse

41

find . | grep -v "excluded files criteria" | xargs rm

এটি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল তালিকাভুক্ত করবে, তারপরে আপনার মানদণ্ডের সাথে মেলে না এমন সমস্তগুলি তালিকাভুক্ত করবে (ডিরেক্টরি নামের সাথে মেলে এটি থেকে সাবধান থাকুন) এবং তারপরে সেগুলি সরিয়ে ফেলুন।

আপডেট : আপনার সম্পাদনার উপর ভিত্তি করে আপনি যদি তালিকাভুক্ত ফাইলগুলি বাদ দিয়ে যদি সত্যই বর্তমান ডিরেক্টরি থেকে মুছতে চান তবে এটি ব্যবহার করা যেতে পারে:

mkdir /tmp_backup && mv textfile.txt backup.tar.gz script.php database.sql info.txt /tmp_backup/ && rm -r && mv /tmp_backup/* . && rmdir /tmp_backup

এটি একটি ব্যাকআপ ডিরেক্টরি তৈরি করবে /tmp_backup(আপনি মূল অধিকার পেয়েছেন, ডান?), আপনার সেই ডিরেক্টরিতে তালিকাভুক্ত ফাইলগুলি সরানো হবে, বর্তমান ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত কিছু মুছুন (আপনি জানেন যে আপনি সঠিক ডিরেক্টরিতে রয়েছেন, আপনি কি?), সরান বর্তমান ডিরেক্টরিতে ফিরে যান /tmp_backupএবং সবশেষে মুছুন /tmp_backup

আমি ব্যাকআপ ডিরেক্টরিটি রুটে থাকার জন্য বেছে নিই, কারণ আপনি যদি রুট থেকে পুনরাবৃত্তভাবে সবকিছু মুছতে চেষ্টা করছেন তবে আপনার সিস্টেমে বড় সমস্যা হবে।

এটি করার জন্য অবশ্যই আরও মার্জিত উপায় রয়েছে তবে এটি বেশ সোজা is


2
উদাহরণস্বরূপ, মধ্যবর্তী লেটেক্স ফাইলগুলি পরিষ্কার করার জন্য: যেমন find . | egrep -v "\.tex|\.bib" | xargs rm
এমআরজেপ

আশ্চর্যজনক আদেশ! ডিরেক্টরিগুলি সরানোর জন্য কেবল আরএম-আর-এ পরিবর্তিত হবে
এরিস

1
আপনি যদি কেবল বাদ পড়ে থাকা মানদণ্ড ব্যতীত বর্তমান ডিরেক্টরিতে থাকা সমস্ত কিছু মুছতে চান: find . -maxdepth 1 | grep -v "exclude these" | xargs rm -rঅযথা ডিরেক্টরিতে ড্রিল করার প্রয়োজন না হওয়ায় এটি আরও দ্রুত কাজ করে।
বিলেণোহ

পুনরায় findপাইপলাইন: দক্ষতার সমস্যাগুলি একপাশে ( findএকা কী করতে পারে তার জন্য 3 টি কমান্ড ব্যবহৃত হয়), এটি এম্বেডড স্পেস সহ ফাইলের নামগুলির সাথে কাজ করবে না এবং সম্ভবত ভুল ফাইলগুলি মুছবে।
mklement0

যে আদেশটি "টু-টু সেভড" ফাইলগুলিকে অন্য স্থানে সংরক্ষণ করে ( /tmp_backup) এটির মধ্যে বাধা থাকলে ভাল হয় না the ব্যবহারকারীর দৃষ্টিকোণ থেকে, সমস্ত ফাইল নিখোঁজ হয়ে গেছে, যদি না জানে যে সেগুলি ফিরে পেতে তাদের কোথায় খুঁজছেন । যে কারণে আমি এই ধরণের কৌশলটির পক্ষে নই।
ক্রেগ ম্যাককুইন

20

অনুমান করে যে এই নামের নামের ফাইলগুলি ডিরেক্টরী ট্রিতে একাধিক জায়গায় রয়েছে এবং আপনি সেগুলি সব সংরক্ষণ করতে চান:

find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete

19

আপনি ব্যাশে গ্লোবিগনোর এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করতে পারেন।

মনে করুন আপনি পিএইচপি এবং এসকিএল ব্যতীত সমস্ত ফাইল মুছতে চান, তবে আপনি নিম্নলিখিতটি করতে পারেন -

export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=

এর মতো গ্লোবগিনোর সেট করা "এলএস *" বা "আরএম *" এর মতো ব্যবহৃত ওয়াইল্ডকার্ডগুলি থেকে পিএইচপি এবং এসকিউএল উপেক্ষা করে। সুতরাং, ভেরিয়েবল সেট করার পরে "rm *" ব্যবহার করা কেবল txt এবং tar.gz ফাইলটি মুছে ফেলবে।


6
+1 টি; GLOBIGNOREভেরিয়েবলটি সেট এবং পুনঃস্থাপনের একটি সহজ বিকল্প (GLOBIGNORE='*.php:*.sql'; rm *)
হ'ল সাব

19

আমি সাব কোয়েরি তালিকা ব্যবহার করতে পছন্দ করি:

rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`

-v, --invers-ম্যাচটি অ-ম্যাচিং লাইন নির্বাচন করুন

\| বিভাজক


1
মার্জিত সমাধান
জোশুয়া সালাজার

9

যেহেতু কেউ এটি উল্লেখ করেনি:

  • আপনি মুছে ফেলতে চান না এমন ফাইলগুলি নিরাপদ জায়গায় অনুলিপি করুন
  • সমস্ত ফাইল মুছুন
  • অনুলিপি করা ফাইলগুলি আবার জায়গায় সরান

2
এটি আরও জটিল কারণ আপনি অনুমতিগুলি আবার নকল করার পরে আপনাকে তাদের যত্ন নিতে হবে care
রোমুলাস

2
@ রেমাসআভ্রাম আপনি অনুমতিগুলি সংরক্ষণ করতে cpবা rsyncসংরক্ষণ করতে উপযুক্ত সুইচ ব্যবহার করতে পারেন । যাইহোক, এটি কেবলমাত্র বিকল্প পদ্ধতি (পরামর্শ হিসাবে দেওয়া) এটির ওপির উত্তর হিসাবে এখানে এটির জায়গা রয়েছে।
gniourf_gniourf

এটি অনেক পরিস্থিতিতে উপযুক্ত হতে পারে না যেখানে ফাইলগুলি ধরে রাখা উচিত অন্য প্রক্রিয়াগুলি সক্রিয়ভাবে ব্যবহার করা হচ্ছে। এটি মুছে ফেলা ফাইলগুলির মধ্যে একটি ভারী বিষয় মাত্র একটি ছোট উপসেট এবং বিপুল সংখ্যক ফাইল জড়িত।
কোডফোরস্টার

@ কোডফোরস্টার: অবশ্যই তবে এমন পরিস্থিতি রয়েছে যেখানে এটি উপযুক্ত, যদিও ... আসলে আমি আপনার মন্তব্যের মূল বিষয়টি দেখতে পাচ্ছি না :)
gniourf_gniourf

6

আপনি এটির জন্য লুপের জন্য লিখতে পারেন ...%)

for x in *
do
        if [ "$x" != "exclude_criteria" ]
        then
                rm -f $x;
        fi
done;

6

ওপির জন্য কিছুটা দেরি হলেও গুগলের মাধ্যমে যে কেউ এখানে পরে পাবেন তার জন্য আশাবাদী ...

আমি উত্তর উত্তর পেয়েছি এবং @ জ্যামি বুলকের দ্বারা মুছে ফেলার বিষয়ে মন্তব্যটি সত্যিই দরকারী। একটি সাধারণ ইউটিলিটি যাতে আপনি প্রতিবার ন্যূনতম টাইপিংয়ের মাধ্যমে বিভিন্ন ফাইলের নাম / প্রকার উপেক্ষা করে বিভিন্ন ডিরেক্টরিতে এটি করতে পারেন:

rm_except (বা যাই হোক না কেন এটির নাম দিন)

#!/bin/bash

ignore=""

for fignore in "$@"; do
  ignore=${ignore}"-not -name ${fignore} "
done

find . -type f $ignore -delete

যেমন পাঠ্য ফাইল এবং foo.bar ব্যতীত সমস্ত কিছু মুছতে:

rm_except *.txt foo.bar 

@ মিশুনিকার মতো, তবে আইফোনটি ছাড়াই।


5

আপনি যদি zshউচ্চতর প্রস্তাবিত ব্যবহার করে থাকেন ।

rm -rf ^file/folder pattern to avoid

সঙ্গে extended_glob

setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)

4

এটি দিয়ে কাজ করার চেষ্টা করে:

rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)

তবে স্পেসগুলির সাথে নামগুলি (সর্বদা হিসাবে) শক্ত। Virtualbox\ VMsপরিবর্তে উদ্ধৃতি দিয়ে চেষ্টা করা । এটি সর্বদা সেই ডিরেক্টরিটি মুছে দেয় ( Virtualbox VMs)।


ফাইলগুলির জন্য কাজ করে না। rm !(myfile.txt)myfile.txt
খাসারিম

shopt -s extglob@ pl1nk নির্দেশিত হিসাবে প্রথমে মৃত্যুদণ্ড কার্যকর করা উচিত
zhuguowei

হ্যাঁ, ব্যাশে বর্ধিত গ্লোববিং ( এক্সগ্লোব ) সক্রিয় করা খুব গুরুত্বপূর্ণ , আমি প্রতিদিনের রুটিন ভিত্তিতে ল্যাবগুলিতে কয়েকটি ম্যাকের মাধ্যমে এটি করছি: shopt -s extglobএবং তারপরে cd /Users/alumno/এবং শেষ পর্যন্ত এখানেrm -rf !(Applications|Virtualbox*VMs|Downloads|Documents|Desktop|Public|Library) বর্ধিত গ্লোববিং সম্পর্কে পড়ুন
জুনিয়াল

4

শুধু:

rm $(ls -I "*.txt" ) #Deletes file type except *.txt

বা:

rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf

এটি সুপারিশ করা হয় না। পার্সিং lsআউটপুট সমস্যা হয়ে উঠতে পারে is বিস্তারিত তথ্যের জন্য এখানে দেখুন ।
আরজে

2

ফাইলগুলি অপরিবর্তনীয় করে তুলুন। রুট এমনকি তাদের মুছে ফেলার অনুমতি দেওয়া হবে না।

chattr +i textfile.txt backup.tar.gz script.php database.sql info.txt
rm *

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

chattr -i *

0

এটি @ সিউই-শেনের মন্তব্যের অনুরূপ তবে -oএকাধিক নিদর্শন করার জন্য আপনার পতাকাটি দরকার । -oপতাকার 'বা' ঘোরা

find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm


0

আপনি দুটি কমান্ড সিকোয়েন্স সহ এটি করতে পারেন। প্রথমে আপনি যে ফাইলগুলি বাদ দিতে চান না তার নামের সাথে একটি অ্যারের সংজ্ঞা দিন:

files=( backup.tar.gz script.php database.sql info.txt )

এরপরে, আপনি যে ডিরেক্টরিটি বাদ দিতে চান সেই ডিরেক্টরিতে সমস্ত ফাইল লুপ করুন, ফাইল নামটি যে অ্যারেতে আপনি বাদ দিতে চান না তা পরীক্ষা করছে; যদি তা না হয় তবে ফাইলটি মুছুন।

for file in *; do
  if [[ ! " ${files[@]} " ~= "$file"  ]];then
    rm "$file"
  fi
done

রেজেক্সের তুলনাটি ভুল - এটি কোনও ফাইল সুরক্ষিত করবে যার নাম সুরক্ষিত ফাইলগুলির একটির একটি স্তর (যদিও পার্শ্ববর্তী স্থানগুলি কিছুটা প্রশমিত করে দেয়; তবে ফাইলের নামগুলি ফাঁকা স্থান ধারণ করতে পারে)। আপনার সমস্ত ফাইলের একটি অ্যারে সংগ্রহ করা উচিত, তারপরে আপনি যে অ্যারে থেকে বাদ দিতে চান সেই ফাইলগুলি বিয়োগ করুন, তারপরে অবশিষ্ট ফাইলগুলি সরিয়ে ফেলুন।
ট্রিপলি

-1

যেহেতু কেউ এখনও এটি উল্লেখ করেনি, একটি বিশেষ ক্ষেত্রে:

OLD_FILES=`echo *`
... create new files ...
rm -r $OLD_FILES

(বা কেবল rm $OLD_FILES)

অথবা

OLD_FILES=`ls *`
... create new files ...
rm -r $OLD_FILES

shopt -s nullglobকিছু ফাইল যদি হয় বা না থাকে তবে আপনার ব্যবহারের প্রয়োজন হতে পারে:

SET_OLD_NULLGLOB=`shopt -p nullglob`
shopt -s nullglob
FILES=`echo *.sh *.bash`
$SET_OLD_NULLGLOB

নালাগ্লোব ছাড়াই echo *.sh *.bashআপনাকে "a.sh b.sh * .Bash" দিতে পারে।

(সমস্ত কিছু বলার পরেও আমি নিজেই এই উত্তরটি পছন্দ করি , যদিও এটি ওএসএক্সে কাজ করে না)


লিওনার্দো হারমোসোর বিদ্যমান উত্তরটি কম বাগ সহ এটি করে। এটি স্পেস সহ ফাইলের নামের জন্য ব্যর্থ হবে; একটি অ্যারের ব্যবহার মার্জিতভাবে সেই নির্দিষ্ট সমস্যাটি সমাধান করে (এবং খুব কম গুরুত্বপূর্ণভাবে তার ব্যক্তিগত ভেরিয়েবলগুলির জন্য বড় হাতের অক্ষর ব্যবহার করা এড়ানো হয়, যা সাধারণত এড়ানো যায়)।
ট্রিপলি

-3

ডাইরেক্ট কমান্ডের পরিবর্তে, দয়া করে প্রয়োজনীয় ফাইলগুলিকে বর্তমান ডিয়ারের বাইরে টেম্পারে নিয়ে যান। তারপরে rm *বা ব্যবহার করে সমস্ত ফাইল মুছুন rm -r *

তারপরে প্রয়োজনীয় ফাইলগুলি বর্তমান ডিয়ারে সরান।


এটি অনেক পরিস্থিতিতে উপযুক্ত হতে পারে না যেখানে ফাইলগুলি ধরে রাখা উচিত অন্য প্রক্রিয়াগুলি সক্রিয়ভাবে ব্যবহার করা হচ্ছে। এটি মুছে ফেলা ফাইলগুলির মধ্যে একটি জটিল কাজ যা কেবলমাত্র একটি ছোট উপসেট এবং বিপুল সংখ্যক ফাইল জড়িত।
কোডফোরস্টার

-3

ফাইল.নাম বাদ দিয়ে সমস্ত কিছু সরিয়ে ফেলুন:

ls -d /path/to/your/files/* |grep -v file.name|xargs rm -rf

2
এটি ভয়াবহভাবে ব্যর্থ হবে এবং আপনার ডিরেক্টরি / ফাইলগুলির ফাঁকা স্থান বা অস্বাভাবিক অক্ষর থাকলে ডেটা ক্ষতি হতে পারে। আপনার কখনই এলএস পার্স করা উচিত নয়। mywiki.wooledge.org/ParsingLs
আরজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.