এক (বা আরও) ধরণের ফাইল টাইপ বাদে সমস্ত অপসারণ করুন


20

আমি কোনও ফোল্ডারের সমস্ত ফাইল মুছে ফেলার জন্য একটি কমান্ড সন্ধান করার চেষ্টা করেছি তবে এক ধরণের ফাইল টাইপ নয়। তবে আমার কোনও ভাগ্য নেই বলে মনে হচ্ছে। আমি এখন পর্যন্ত যা চেষ্টা করেছি:

set extended_glob
rm !(*.dmg)
# this returns zsh:number expected

rm ./^*.dmg
# this returns no matches found 

আমি zsh এর সংস্করণটি ব্যবহার করছি zsh 5.0.2 (x86_64-apple-darwin13.0.1)

উত্তর:


22

extended_globবিকল্পটি নিজস্ব বর্ধিত zsh দেয় উল্লিখিত glob সিনট্যাক্স

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

আপনি ksh গ্লোবগুলিksh_glob পেতে বিকল্পটি সেট করতে পারেন । সতর্কতা অবলম্বন করুন যে সাধারণ ক্ষেত্রে নেতিবাচক প্যাটার্নটি এই শব্দটির শেষ জিনিস, zsh প্যারেন্থেসিসকে গ্লোব কোয়ালিফায়ার হিসাবে পার্স করতে পারে (এটি কেএসএস এমুলেশন মোডে এটি করে না)।

setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)

এটি কাজ করে না বলে মনে হচ্ছে। আমি যখন চালনা rm -r secrets/!(directory)করি number expectedevent not found: directory
তখনই

@CMCDragonkai "প্রত্যাশিত সংখ্যা" ইঙ্গিত দেয় যে আপনি ksh_globবিকল্পটি সেট করেন নি । "ইভেন্টটি পাওয়া যায় নি: ডিরেক্টরি" ইঙ্গিত দেয় যে আপনি বাশ চালাচ্ছেন (এটি !(…)সিনট্যাক্সটিও বোঝে তবে কেবল পরে shopt -s extglob)।
গিলস 'অশুচি হওয়া বন্ধ করুন'

আমি যখন আমার zsh শেলের মধ্যে ছিলাম তখন আমি কীভাবে বাশ চালাব?
সিএমসিডিগ্রাগনকাই

আমার জন্য, setopt ksh_glob; echo !(a|b)যখন setopt ksh_glob; echo !(a)("প্রত্যাশিত নম্বর") কাজ করে না ...
থিফমাস্টার

@ থিফমাস্টার আমার একই সমস্যা ছিল। এটা কি বাগ?
কোডটওয়ার

5

আপনি findআপনার শেলের পরিবর্তে ব্যবহার করতে পারেন :

find . -mindepth 1 -maxdepth 1 ! -name "*.dmg" -delete

থেকে man find:

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.
   -name pattern
          Base of file name (the path with the leading directories removed)
          matches shell pattern pattern. 
   -delete
          Delete  files; true if removal succeeded.  If the removal failed,
          an error message is issued.  If -delete fails, find's exit status
          will be nonzero (when  it eventually exits).  Use of -delete 
          automatically turns on the -depth option.

যদি আপনি findযে কোনও কারণে ব্যবহার করতে না পারেন তবে এখানে zsh(বা অন্যান্য শেল) এটি করার একটি উপায় । zshসত্ত্বেও zsh, সম্ভবত এটি করার একটি সহজ উপায় আছে তবে আমি যেহেতু একজন bashলোক তাই এটি নিয়েই আমি এলাম:

for file in *; do if [[ ! "$file" == *.dmg ]]; then rm $file; fi; done

দুর্ভাগ্যক্রমে, যখনই আমি আমার ম্যাকটিতে সন্ধান করি এটি কেবল কোনও বিজ্ঞপ্তি ছাড়াই বর্তমান জেডএসশন সেশনটি থেকে বেরিয়ে আসে। আপনার কি একই সমস্যা আছে? find [Process completed]
জাজং নগুইন

1
@nXqd এটি ছাড়াই একটি উপায়ের জন্য আপডেট উত্তর দেখুন find। আমি আপনাকে পরামর্শ দিচ্ছি findযে আপনার সমস্যা সম্পর্কে একটি প্রশ্ন পোস্ট করুন , যদিও এটি হওয়া উচিত নয়। আপনি যদি করেন তবে এর আউটপুট অন্তর্ভুক্ত করুন type -a find
টেরডন

1
এমনকি ব্যাশে, একটি সহজ সমাধান রয়েছে:, rm !(*.dmg)পরে shopt -s extglob
গিলস 21'23

শেল আপনার ডিবাগিং টিপস জন্য @terdon ধন্যবাদ। এর আউটপুটটি সঠিক বলে মনে হচ্ছে:find is a shell function find is /usr/bin/find
Dzung Nguyen

@nXqd যেটি সঠিক নয়, এটি শেল ফাংশন হওয়া উচিত নয়, এটি কেবল হওয়া উচিত /usr/bin/find। আপনার একটি findব্যাশ কনফিগার ফাইলগুলিতে সংজ্ঞায়িত নামে একটি ফাংশন রয়েছে । যেহেতু আপনি উপর ওএসএক্স করছি, যে সম্ভবত এর ~/.profile
টেরডন

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