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


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.