ইউনিক্স - PATTERN বাদে ফাইল এবং ফোল্ডারগুলি মুছুন


10

একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে এমনগুলি বাদ দিয়ে একটি ডিরেক্টরিতে সমস্ত ফাইল / ফোল্ডার মুছে ফেলার কাজটি সম্প্রতি আমার মুখোমুখি হয়েছিল। কাজটি করার জন্য আমি একটি একক-লাইন ইউনিক্স কমান্ড রান্না করেছি। এটি কি এক লাইন হওয়া উচিত? আমি মনে করি না, তবে এটি অবশ্যই শীতল!

সমস্যাটি বেশ সহজ হলেও আমার সমাধানটি কতটা জটিল হয়েছিল তা নিয়ে আমি একটু অবাক হয়েছিলাম। আমি যে আদেশটি ব্যবহার করেছি তা এখানে; দ্রষ্টব্য: এটি একটি দুর্বল সমাধান কারণ এটি লাইন-ফিড অক্ষরযুক্ত ফাইলের নামগুলি হ্যান্ডেল করে না (যা আমার পরিস্থিতিতে গুরুত্বপূর্ণ নয়)।

ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE

আমি "ফাইন্ড" কমান্ডটি ব্যবহার করিনি কারণ আমি প্যাটার্নের সাথে মেলে ফোল্ডারে পুনরাবৃত্তি করতে চাই না। উদাহরণস্বরূপ, নিম্নলিখিত ফাইল গঠন বিবেচনা করুন:

file_foo.txt
first_dir
  |
  +--> contents
  +--> ...
foo_dir
  |
  +--> anotherfile.txt
  +--> morefiles.log
foo_file.txt
somefile.txt

প্যাটার্ন "foo বিন্যাস" ব্যবহার কেবল "first_dir" (এবং এটি এর কোর্স বিষয়বস্তু) এবং "somefile.txt" (সরাতে হবে না "anotherfile.txt" বা "morefiles.log")।

প্রশ্ন, এটি সম্পাদন করার জন্য আরও ভাল (আরও মার্জিত এবং সঠিক) উপায় আছে?


সম্পাদনা:
এটি সম্প্রতি আমার নজরে এনেছিল যে "সন্ধান" আরও ভাল বিকল্প হতে পারে :

find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf

এই সমাধানটি লাইন-ফিডের অক্ষরগুলি সহ সঠিকভাবে পরিচালনা করে।


সম্পাদনা: "ফার্স্ট_ডির" সংশোধন করতে ভুল "the_dir" পরিবর্তন হয়েছে changed
joxl

উত্তর:


10

নিম্নলিখিত উদাহরণগুলির উপসর্গ তৈরি হয়েছে echoযাতে আপনি প্রকৃতপক্ষে সেগুলি ব্যবহারের আগে পরীক্ষা করতে পারেন। echoসক্রিয় করার জন্য অপসারণ করুন rm -rfrm -riনিশ্চিতকরণের জন্য প্রম্পট বিকল্প ।

ksh এর গ্লোববিংয়ের সাথে নেতিবাচক ম্যাচ এক্সটেনশন রয়েছে:

# ksh
echo rm -rf !(*foo*)

একই বাক্য গঠন পাওয়া যায় ব্যাশ আপনাকে সেট যদি extglobবিকল্প:

# bash
shopt -s extglob
echo rm -rf !(*foo*)

এর জন্য zsh এর নিজস্ব বাক্য গঠন রয়েছে:

# zsh
setopt extended_glob
echo rm -rf ^*foo*

এটি ksh- স্টাইল সিনট্যাক্স ব্যবহার করতে পারে :

# zsh: ksh-style glob syntax
setopt ksh_glob no_bare_glob_qual
echo rm -rf !(*foo*)

# zsh: ksh-style glob syntax, adapted for the default bare_glob_qual option
setopt ksh_glob bare_glob_qual
echo rm -rf (!(*foo*))

সরল, মার্জিত, হ্যান্ডলগুলি লাইনফীড অক্ষর, (প্রায়) এক লাইন (আমি জুড়েছেন shopt -s extglobআমার .bashrc ফাইলের, তাই এটি এখন হয় একটি এক মাছ ধরার নৌকা)। পারফেক্ট! আমার খ্যাতি এটি অনুমোদনের সাথে সাথেই একটি উত্থানের প্রতিশ্রুতি দিচ্ছি।
joxl

7

এখানে আরও একটি findসমাধান। আমি নিশ্চিত নই যে এটির আপনার কাছে কোনও আসল সুবিধা রয়েছে তবে এটির প্রয়োজন নেই xargsএবং * বিরল সম্ভাবনা যা * খুব বেশি নামেই প্রসারিত for

find . -maxdepth 1 ! -name PATTERN -type f -delete

আমি এটিও যুক্ত -type fকরেছি যাতে এটি ডিরেক্টরি মুছতে চেষ্টা না করে।

সতর্কতা: -deleteশক্তিশালী। আমি আমার একটি পরীক্ষার ফাইলকে 0 টি অনুমতি দিয়েছি এবং উপরের কমান্ডটি বিনা দ্বিধায় তা মুছে ফেলে।


6
প্রথম পরীক্ষা। এটি আপনি যে ফাইলগুলি চেয়েছিলেন সেটি সন্ধান করছে কিনা তা -deleteদিয়ে প্রতিস্থাপন করুন -print। যদি সবকিছু ঠিক থাকে তবে আপনি একই সন্ধানকারী ফিল্টারগুলির সাথে কাজ করছেন তা নিশ্চিত করতে পূর্ববর্তী কমান্ডটিতে ফিরে যেতে কমান্ডের ইতিহাসটি (উদাহরণস্বরূপ আপ বোতাম টিপুন) ব্যবহার করুন।
ডগ হ্যারিস

মনোযোগ সহকারে পড়ুন, নোট করুন যে আমি ডিরেক্টরিগুলি সরাতে চাই না । এবং find -deleteখালি নয় ডিরেক্টরিগুলি সরিয়ে ফেলবে না। এটিও লক্ষ করুন যে find -maxdepth 1"মিলছে" " (বর্তমান ডিরেক্টরি) যা সত্যই খারাপ। যদিও আমি আপনার ভাবনা বাদ দেওয়ার মত পছন্দ করি তবে xargsএকটি find -execবিকল্প হিসাবে ব্যবহার করতে পারে । find * -maxdepth 0 ! -name PATTERN -exec rm -rf '{}' \;
joxl

0

আপনি এই বিদ্রোহী স্ক্রিপ্ট উদাহরণটি ব্যবহার করতে পারেন http://askcodegeneration.com/keep-subversion/ পরিবর্তে যা আরও বেশি বোধগম্য এবং যা ফোল্ডার নির্বাচন এবং নিশ্চিতকরণের মতো ব্যবহারকারীর ইন্টারঅ্যাকশন পরিচালনা করতে পারে:

delete-file: func[file][
    if/else none? find file "/.svn/" [
        delete file
    ][
        print ["keeping" file]
    ]
]
dir: request-dir
ans: ask rejoin ["Do you confirm " dir "? (Yes): "]
if (ans = "Yes") [
    foreach-file dir :delete-file
]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.