নির্দিষ্ট নাম ব্যতীত কোনও ফোল্ডারের অভ্যন্তরে সমস্ত ফোল্ডার মুছুন


18

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

ফোল্ডার 'মাইফোল্ডার' এর 3 টি সাব ফোল্ডার রয়েছে: 'টেস্ট 1', 'টেস্ট 2' এবং 'টেস্ট 3' আমার 'টেস্ট 2' ব্যতীত সমস্ত মুছতে হবে।

আমি এখানে সঠিক নামের সাথে মেলে চেষ্টা করছি:

find /home/myfolder -type d ! -name 'test2' | xargs rm -rf

অথবা

find /home/myfolder -type d ! -name 'test2' -delete

এই কমান্ডটি সর্বদা মূল ফোল্ডারটি 'মাইফোল্ডার' মুছে ফেলার চেষ্টা করে! এই সমস্যা এড়ানোর জন্য একটি উপায় আছে কি ?


6
ইউনিক্স এবং লিনাক্সে আমরা এইগুলি "ডিরেক্টরিগুলি" বলি, "ফোল্ডার" নয়।
— tchrist

1
আপনার শেলের উপর নির্ভর করে আপনার সেই !অপারেটরটি উদ্ধৃত করতে পারে : \!বা '!'।
— টবি স্পিড

উত্তর:


32

এটি ./myfolderব্যতীত সমস্ত ফোল্ডার মুছে ফেলা হবে ./myfolder/test2এবং এর সমস্ত সামগ্রী সংরক্ষণ করা হবে:

find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?' -delete

কিভাবে এটা কাজ করে

  • find ফাইন্ড কমান্ড শুরু করে।
  • ./myfolderডিরেক্টরি ./myfolderএবং এর বিষয়বস্তু দিয়ে অনুসন্ধান শুরু করতে বলে ।

  • -mindepth 1 নিজের সাথে মেলে না ./myfolder, কেবল এটির অধীনে থাকা ফাইল এবং ডিরেক্টরি।

  • ! -regex '^./myfolder/test2\(/.*\)?'!নিয়মিত ভাবের সাথে মেলে এমন কোনও ফাইল বা ডিরেক্টরি বাদ দিতে ( )) বলে ^./myfolder/test2\(/.*\)?। ^পথ নামের শুরুতে মেলে। এক্সপ্রেশনটি (/.*\)?মেলে (ক) একটি স্ল্যাশ এর পরে কিছু বা (খ) কিছুই মিলবে না।

  • -delete ম্যাচিং ফাইলগুলি (এটি, বাদ নয়) ফাইলগুলি মুছতে বলে

উদাহরণ

দেখতে এমন একটি ডিরেক্টরি কাঠামো বিবেচনা করুন;

$ find ./myfolder
./myfolder
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

এটি -deleteকী মিলছে তা দেখতে আমরা অনুসন্ধান আদেশটি (ছাড়াই ) চালাতে পারি :

$ find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?'
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3

যে ফাইলগুলি রয়ে গেছে তা দেখে আমরা এটি যাচাই করতে পারি:

$ find ./myfolder
./myfolder
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

1
একমাত্র সাব-ডিরেক্টরিকে -pruneছেড়ে যাওয়ার বিকল্প test2/*/: ফিরে আসুন rm -rএবং যুক্ত করুন -maxdepth 1।
— টবির স্পীড

@ আইসাক ঠিক আছে সম্পন্ন. (এছাড়াও আপনার দুর্দান্ত উত্তরের জন্য +1))
— 1024

চমৎকার কাজ !, কিন্তু দুঃখিত: যে সব মুছে ফেলা হবে ফাইল ভিতরে ./myfolder। আপনার কেবলমাত্র ডিরেক্টরিগুলির-type d জন্য একটি অনুপস্থিত (IMvhO) প্রয়োজন ।
— notAnUnixNazi

ঠিক আছে, এটি আপনি যেমন চান তেমন কাজ করা উচিত:find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'
— নটঅনিক্সনাজি

10

ব্যাশ ব্যবহার :

shopt -s extglob
rm -r myfolder/!(test2)/

উদাহরণ:

$ tree myfolder/
myfolder/
├── test1
│   └── file1
├── test2
│   └── file2
└── test3
    └── file3

$ echo rm -r myfolder/!(test2)
rm -r myfolder/test1 myfolder/test3
$ rm -r myfolder/!(test2)
$ tree myfolder/
myfolder/
└── test2
    └── file2

1 directory, 1 file

5

TL; ড

find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 \
     -exec echo rm -rf '{}' \;

ফাইলগুলির তালিকায় সন্তুষ্ট হলে প্রতিধ্বনি সরান।


ব্যবহারের মাধ্যমে -mindepth 1নিশ্চিত হবে যে শীর্ষ ডিরেক্টরিটি নির্বাচিত নয়।

$ find ./myfolder -mindepth 1 -type d
./myfolder/test2
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

কিন্তু একটি ভিতরে ভিতরে subdirs এড়ানো -not -name test2হবে নাtest2 :

$ find ./myfolder -mindepth 1 -type d -not -name 'test2'
./myfolder/test2/one
./myfolder/test2/two
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

এটি করার জন্য, আপনার প্রুনের মতো কিছু দরকার:

$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test
./myfolder/test/a1
./myfolder/test/a1/a2
./myfolder/test/a1/a2/a3

তবেdelete এটি ব্যবহার হিসাবে ব্যবহার করবেন না depthএবং এটি দীর্ঘতম পথ থেকে মুছে ফেলা শুরু করবে:

$ find ./myfolder -depth -mindepth 1 -name test2 -prune -o -type d -print
./myfolder/test/a1/a2/a3
./myfolder/test/a1/a2
./myfolder/test/a1
./myfolder/test

হয় ব্যবহার করুন rm -rf( echoআপনি যদি মুছতে চান তবে সরান ):

$ find ./myfolder -mindepth 1 -name test2 -prune -o -type d -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test
rm -rf ./myfolder/test/a1
rm -rf ./myfolder/test/a1/a2
rm -rf ./myfolder/test/a1/a2/a3

অথবা, এছাড়াও ব্যবহার maxdepthযদি আপনার যা দরকার তা ডিরেক্টরি (এবং সবকিছু ভিতরে) মুছে ফেলে (অপসারণ করা হয় echoআসলে নিশ্চিহ্ন):

$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -exec echo rm -rf '{}' \;
rm -rf ./myfolder/test

-deleteডিরেক্টরিটি ফাঁকা না থাকলে একটি এখনও ব্যর্থ হবে:

$ find ./myfolder -mindepth 1 -maxdepth 1 -type d -not -name test2 -delete
find: cannot delete ‘./myfolder/test’: Directory not empty

2

আপনি যদি zsh ব্যবহার করছেন তবে আপনি এটি করতে পারেন:

setopt extended_glob # if you don't have it enabled

rm -rf myfolder/^test2

0

নীচের কমান্ড দিয়ে পরীক্ষা করা হয়েছে এবং এটি ভাল কাজ করেছে

find  /home/myfolder -maxdepth 1 -type d ! -iname test2 -exec rm -rvf {} \;

আপনি ওপি-র মতো একই সমস্যায় পড়েছেন; কমান্ড-লাইনে তালিকাভুক্ত / হোম / ফোল্ডার (সমালোচনা ছাড়াই -mindepth 1) শীর্ষস্থানীয় ডিরেক্টরিটি সমস্ত মানদণ্ডের সাথে মেলে (এটি একটি ডিরেক্টরি এবং এটি "টেস্ট 2" নামকরণ করা হয়নি) এবং তাই এটি মুছে ফেলা হয়।
— জেফ শ্যাচলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.