খালি সাবফোল্ডারগুলি মুছুন, প্যারেন্ট ফোল্ডারটি রাখুন


15

আমি যখন ব্যবহার করি

find /home/user/parentdir -type d -empty -delete

এটি খালি সাবফোল্ডারগুলির ভিতরে পুনরাবৃত্তভাবে দেখায় /home/user/parentdirএবং সেগুলি মুছে দেয়। তবে যদি /home/user/parentdirএটি খালিও থাকে তবে এটি parentdirফোল্ডারটিও মুছে ফেলবে , যা আমার পক্ষে অযাচিত।

আমি এই রাখতে চান parentdirকরতে rsyncব্যাকআপ বা ক্লাউডে কিছু ফাইল। প্রক্রিয়াজাতকরণের পরে, আমার খালি ফোল্ডারগুলি মুছতে হবে তবে parentdirপ্রতিবার পুনরায় তৈরি করতে অনুৎপাদনকারী বলে মনে হচ্ছে ।

কোন পরামর্শ রাখতে হবে parentdir? আমি এর .nocopyভিতরে একটি ফাইল তৈরি করার কথা ভেবেছিলাম এবং এটিকে বাদ দিয়েছিলাম rsync, তবে দেখতে ওভারকিলের মতো লাগে। আরও কি মার্জিত উপায় আছে?


যদি আপনি / প্যারেন্টারির শেষে (যেমন / প্যারেন্টার /) একটি ফরোয়ার্ড স্ল্যাশ যুক্ত করেন তবে কী কোনও পার্থক্য রয়েছে?
গ্রাহাম


@ গ্রাহাম / প্যারেন্টডির / পিতামহিরও মুছে ফেলেন, তাই কোনও পার্থক্য নেই।
টিএনটি

আহ, আমি দেখতে পাচ্ছি যে আমি শেষটি * মিস করেছি যা @ আমৌরক তার উত্তরে উল্লেখ করেছে।
গ্রাহাম

উত্তর:


25

কেবলমাত্র কি find /home/user/parentdir -mindepth 1 -type d -empty -delete

দেখুন:

$ mkdir -p test1/test2
$ find test1 -type d
test1
test1/test2
$ find test1 -mindepth 1  -type d
test1/test2

find /home/user/parentdir/* AmourK এর উত্তরে যখন ফাইল অনেক এবং এটি overcomplicated হয় মাকরূহ।


15

যোগ করে /*শেষে parentdir, আপনি parentdir এর বদলে সব subdirs পদক্ষেপ সম্পাদন করা হয় parentdirনিজেই। এবং একইভাবে /home/user/পুরানো কমান্ডে parentdirমুছে ফেলা হয় না, নীচের কমান্ডে মুছে ফেলা হবে না। *একে গ্লোব অপারেটর বলা হয় এবং এটি অক্ষরের যে কোনও স্ট্রিংয়ের সাথে মেলে।

find /home/user/parentdir/* -type d -empty -delete


7
এই পদ্ধতির সাথে সচেতন হওয়ার একটি বিষয় হ'ল যদি এখানে প্রচুর সংখ্যক ফাইল থাকে /home/user/parentdir/তবে প্রসারিত গ্লোব অতিক্রম করতে পারে ARG_MAX, যার ফলে একটি যুক্তি তালিকা খুব দীর্ঘ ত্রুটি হতে পারে। আপনি বিশ্বব্যাপী পরিবর্তন করে */এমনটি হওয়ার সম্ভাবনা হ্রাস করতে পারেন যাতে এটি কেবল ডিরেক্টরিগুলির সাথে মেলে।
স্টিল্ড্রাইভার

12
এছাড়াও সাবধান থাকুন যে এটি কোনও বিন্দু দিয়ে শুরু করে কোনও শিশুকে খুঁজে পাবে না। এবং কোনও দিন আপনি এটি উপলব্ধি করতে পারবেন, এবং যদি আপনি "। *" এর জন্যও সন্ধান করেন তবে আপনি আঘাতের এক বিশাল বিশ্বে থাকবেন (কারণ "। *" ম্যাচগুলি "..")। আমি জানি কিভাবে জিজ্ঞাসা করুন।
গ্লেন উইলেন

1
@ গ্লেনওয়িলেন আমার মনে হয় কেন আপনি এই গল্পটি বলতে বলার আগে আমাদের সামনে পানীয় নিয়ে একটি বারে বসে থাকা উচিত?
মন্টি হার্ডার

@ মন্টিহার্ডার এটি ভাগ্যক্রমে এতটা খারাপ ছিল না যতটা হতে পারে। এটি আমার প্রথম ইউনিক্স সিস্টেমে ছিল, এটি আমার হাইস্কুলের মালিকানাধীন একটি সোলারিস মেশিন ছিল। Godশ্বরকে ধন্যবাদ আমি 'আরএম' চালাচ্ছিলাম না, বরং 'ছোঁয়া' ছিল। আমি আমার হোম ডিরেক্টরিতে থাকা সমস্ত কিছুর মালিকানা ঠিক করার চেষ্টা করতে রুট ব্যবহার করছিলাম। পরিবর্তে আমি নিজেকে প্রত্যেক হোম ডিরেক্টরি (এবং তাদের সমস্ত বিষয়বস্তু) এর মালিকানা দিয়েছিলাম এবং তারপরে সেগুলি সমস্ত ফিরিয়ে দিতে হয়েছিল।
গ্লেন উইলেন

আমি একটি সহকর্মী একটি নতুন সফটওয়্যার কিভাবে টুকরা ইনস্টল করতে একটি নতুন কর্মচারী প্রশিক্ষণ ছিল। /tmpএটিতে যাওয়া , একটি উপ-ডিরেক্টরি তৈরি করা , সেখানে একটি জিজিপড টারবল আনপ্যাক করা, ইনস্টলার চালানো এবং পরিষ্কার করা জড়িত । rm -rf /tmp/foo-installনবজাতকটি এটি করার সঠিক উপায় বলে মনে করেছিলেন এবং অভিজ্ঞ হাতটি যেমন তাঁর সেরা দার্থ-ভাদার-এ-পর্ব-তৃতীয়-পর্বের শেষের দিকের "নুও" বলেছিলেন, নবাগত খুব শক্ত পথটি খুঁজে পেয়েছিলেন যে কতটা কাছাকাছি / এবং এন্টার কীগুলি একে অপরের কাছে ছিল। আমাদের ব্যাকআপ সফ্টওয়্যারের পুনরুদ্ধার ডিস্ক থেকে বুট করতে হয়েছিল এবং পুরো সার্ভারটি টেপ থেকে পুনরায় লোড করতে হয়েছিল।
মন্টি হার্ডার

0

যদি আপনার পিএইচপি-ক্লাইম ইনস্টল থাকে,

printf %s $(pwd) | php -r 'function f(string $dir){var_dump($dir);$dir.=DIRECTORY_SEPARATOR;foreach(glob("$dir*",GLOB_ONLYDIR) as $d){f($d);}global $original;if(substr($dir,0,-strlen(DIRECTORY_SEPARATOR))!==$original && empty(glob("$dir*"))){rmdir($dir);}}f(($original=stream_get_contents(STDIN)));'

আপনি চেয়েছিলেন foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());বা এর কাছাকাছি কিছু $skippedপ্রথমটিকে এড়িয়ে যাওয়ার যত্ন নেয়, @rmdirএকটি দির সরিয়ে দেওয়ার চেষ্টা করে এবং নিঃশব্দে (এটিই @) ব্যর্থ হয় যদি খালি না হয়।
chx

0

যখন আপনার কেবলমাত্র একটি স্তর প্রয়োজন (পিতা-মাতা ফোল্ডারটি রেখে, তবে খালি শিশু ফোল্ডারগুলি মুছে ফেলা হচ্ছে), তখন একটি সহজ কৌশল ব্যবহার করা হয় rmdir

rmdir parent/*

সমস্ত খালি সাবফোল্ডার মুছে ফেলে তবে কেবল ফাইল এবং খালি খালি ফোল্ডারগুলির জন্য একটি ত্রুটি মুদ্রণ করে।

এটি পুনরাবৃত্তির সাথে কাজ করে না, তবে আপনার ফোল্ডারটির কাঠামোটি জানার সময় এটির মতো কিছু করার দ্রুততম উপায় হতে পারে

rmdir parent/*/*/* # deletes parent/a/b/c when empty
rmdir parent/*/* # deletes parent/a/b when it is now empty
rmdir parent/* # deletes parent/a when it is now empty

সুবিধা: মনে রাখা সহজ, টাইপ করা দ্রুত, একটি ভুল পরামিতি চয়ন করার সম্ভাবনা কম।
অসুবিধা: কম নমনীয়, সম্ভবত আপনার টার্মিনালে প্রচুর ত্রুটি বার্তা।

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