উত্তর:
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
.pdf
ফাইলের নাম মধ্যেউদাহরণস্বরূপ, যদি temp
আপনার হোম ফোল্ডারে কোনও ডিরেক্টরি বলা হয়:
cd ~/temp
তারপরে ফাইলগুলি মুছুন:
find . -type f ! -iname "*.pdf" -delete
এটি বাদে সমস্ত ফাইল মুছে ফেলা হবে xyz.pdf
।
আপনি এই দুটি কমান্ড একত্র করতে পারেন:
find ~/temp -type f ! -iname "*.pdf" -delete
.
বর্তমান ডিরেক্টরি। !
মানে ফাইলগুলি বাদে সব .pdf
শেষে নেওয়া। -type f
ডিরেক্টরি নয় কেবল ফাইল নির্বাচন করে। -delete
এটি মুছে ফেলা মানে।
!
আগে আসতে হবে -name
। কেবলমাত্র -name
অন্তর্ভুক্ত থাকবে .pdf
, যখন এবং -iname
উভয়ই অন্তর্ভুক্ত থাকবে.pdf
.PDF
শুধুমাত্র বর্তমান ডিরেক্টরির মধ্যে উপ-ডিরেক্টরির যোগ এবং না মুছে ফেলার জন্য -maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
.
মানে বর্তমান ডিরেক্টরি। !
এর অর্থ .pdf
শেষ ফাইলটি বাদে সমস্ত ফাইল নেওয়া । -delete
এটি মুছে ফেলা মানে। আমি কি এখন পরিষ্কার?
-maxdepth 1
শুরু করার সাথে আপনার প্যারামিটারটি অন্তর্ভুক্ত করা উচিত ছিল । তারপরে কেউ পুনরাবৃত্তভাবে মুছতে চাইলে প্যারামিটারটি সরিয়ে ফেলার পরামর্শ দিন।
সঙ্গে bash
'বর্ধিত শেল globbing গুলি, আপনি ছাড়া অন্য এক্সটেনশনগুলি সহ কোনো ফাইল মুছে ফেলুন পারে .pdf
ব্যবহার
rm -- *.!(pdf)
@ পিটিএস দ্বারা উল্লিখিত হিসাবে, --
অক্ষরগুলি কোনও কমান্ড বিকল্পের সমাপ্তি নির্দেশ করে, ফাইলগুলির বিরল ক্ষেত্রে যাদের নাম একটি -
অক্ষর দিয়ে শুরু হয় সেই ক্ষেত্রে কমান্ডটি নিরাপদ করে তোলে ।
আপনি যদি কোনও এক্সটেনশন ছাড়াই ফাইলগুলি এবং সেইসাথে অন্য এক্সটেনশানযুক্ত ফাইলগুলি মুছতে চান .pdf
তবে @ ডেনিসউইলিয়ামসন দ্বারা চিহ্নিত হিসাবে আপনি ব্যবহার করতে পারেন
rm -- !(*.pdf)
বর্ধিত গ্লোববিং ডিফল্টরূপে সক্ষম করা উচিত, তবে তা না হলে আপনি এটি ব্যবহার করে তা করতে পারেন
shopt -s extglob
বিশেষত যদি আপনি এটি কোনও স্ক্রিপ্টের অভ্যন্তরে ব্যবহারের উদ্দেশ্যে নিয়ে থাকেন তবে এটি লক্ষণীয় গুরুত্বপূর্ণ যে যদি অভিব্যক্তিটি কোনও কিছুর সাথে মেলে না (যেমন ডিরেক্টরিতে কোনও নন-পিডিএফ ফাইল নেই) তবে ডিফল্টরূপে গ্লোবটি অপরিবর্তিতভাবে পাস হবে rm
কমান্ড, এর মত একটি ত্রুটি ফলাফল
rm: cannot remove `*.!(pdf)': No such file or directory
আপনি nullglob
শেল বিকল্পটি ব্যবহার করে এই ডিফল্ট আচরণটি পরিবর্তন করতে পারেন , তবে এটির নিজস্ব সমস্যা রয়েছে। আরও বিশদ আলোচনার জন্য নুলগ্লোব - গ্রেগের উইকি দেখুন
rm *~*.pdf
!(*.py)
। এছাড়াও, সম্ভবতঃ, যদি ওপি কেবল ".pdf" ফাইলগুলি বাকী রাখতে চায়, তবে এক্সটেনশান ছাড়াই থাকা ফাইলগুলিও মুছে ফেলা উচিত এবং এড়ানো হবে না।
$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
অথবা mv
কমান্ডের মাধ্যমে (তবে আপনি ট্র্যাশ থেকে এটি পুনরুদ্ধার করতে পারবেন না কারণ এটি .trashinfo তথ্য রেকর্ড করে না, সুতরাং এর অর্থ আপনি আপনার ফাইলগুলি এমন কোনও গন্তব্যে সরিয়ে নিয়েছেন যেখানে এটি নীচের মতো রয়েছে)।
mv !(*.pdf) ~/.local/share/Trash/files
rm
।
সবচেয়ে সহজ পদ্ধতির: কোথাও অন্য ডিরেক্টরি তৈরি করুন (যদি আপনি কেবল একটি ডিরেক্টরিতে মুছছেন তবে পুনরাবৃত্তি না করে, এটি এমনকি উপ-ডিরেক্টরিও হতে পারে); সমস্ত .pdf আছে সেখানে সরান; অন্য সব মুছুন; পিডিএফ এর পিছনে সরানো; মধ্যবর্তী ডিরেক্টরি মুছুন।
দ্রুত, সহজ, আপনি ঠিক কী করছেন তা দেখতে পাবেন। আপনি যে ডিরেক্টরিটি পরিষ্কার করছেন সেটির মধ্যবর্তী ডিরেক্টরিটি একই ডিভাইসে রয়েছে তা নিশ্চিত করুন যাতে চলাচলের নাম পরিবর্তিত হয়, অনুলিপিগুলি হয় না!
ব্যাশের গ্লোবগনোর ব্যবহার করুন:
GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE
বাশের ম্যান পেজ থেকে:
GLOBIGNORE: সেটটি সংজ্ঞায়িত করে নিখুঁত একটি কোলন-বিভাজিত তালিকা ফাইলের নামগুলি পথের নাম সম্প্রসারণ দ্বারা উপেক্ষা করা হবে।
একটি দ্রুত পরীক্ষা:
mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *
আউটপুট:
y.zip z.mp3
এখানে আমি পছন্দ করি এমন একটি পদ্ধতির কারণ এটি আমাকে খুব সাবধানতা অবলম্বন করতে দেয়: আমি যে ফাইলগুলি মুছতে চাইছি কেবল তা দেখানোর জন্য একটি উপায় রচনা করুন, তারপরে সেগুলি rm
ব্যবহারে প্রেরণ করুন xargs
। উদাহরণ স্বরূপ:
ls
আমাকে সব দেখায়ls | grep pdf
আমি যে ফাইলগুলি রাখতে চাই তা আমাকে দেখায়। হুম।ls | grep -v pdf
বিপরীতটি দেখায়: আমি যা রাখতে চাই তা ব্যতীত সমস্ত । অন্য কথায়, এটি মুছে ফেলতে চাই এমন জিনিসগুলির তালিকা প্রদর্শন করে। বিপজ্জনক কিছু করার আগে আমি এটি নিশ্চিত করতে পারি।ls | grep -v pdf | xargs rm
rm
মুছে ফেলার জন্য ঠিক সেই তালিকাটি প্রেরণ করেযেমনটি আমি বলেছি, এটি প্রধানত এটির যে সুরক্ষা সরবরাহ করে তা rm *
জন্য আমি এটি পছন্দ করি: আমার জন্য কোনও দুর্ঘটনা নেই । অন্য দুটি সুবিধা:
ls
বা find
প্রাথমিক তালিকা পেতে পারেন । এই তালিকাটি সংকীর্ণকরণের প্রক্রিয়ায় আপনি নিজের পছন্দ মতো অন্য যে কোনও কিছু ব্যবহার করতে পারেন - অন্য grep
, কিছু awk
বা কিছু হোক। আপনার যদি কেবল সেই ফাইলগুলিকে মুছতে হয় যার নামগুলিতে একটি রঙ থাকে তবে আপনি এটি একইভাবে তৈরি করতে পারেন।find
সন্ধানের জন্য এবং rm
অপসারণের জন্য ব্যবহার করতে পছন্দ করি , এটি মনে রাখতে হবে যে find
কোনও -delete
পতাকা গ্রহণ করে । এবং আপনি যদি এটি করেন তবে আবার আপনি বিকল্প সমাধান রচনা করতে পারেন; এর পরিবর্তে rm
, আপনি একটি trash
কমান্ড তৈরি করতে পারেন যা ফাইলটিকে ট্র্যাশে স্থানান্তরিত করে ("অপসারণের অনুমতি দেয়") এবং এর পরিবর্তে পাইপটি তৈরি করতে পারে rm
। আপনার কাছে find
সেই বিকল্পটি সমর্থন করার দরকার নেই , আপনি কেবল এটিতে পাইপ করুন।ফাইলের নামগুলিতে লাইন বিরতি, ফাইলের নাম my_pdfs.zip
ইত্যাদির মতো কিছু প্রান্তের কেসগুলি হ্যান্ডেল করতে কীভাবে এটি পরিবর্তন করতে পারে তার জন্য @ পাবউকের মন্তব্য দেখুন comments
pdf
এটির নামের যে কোনও ফাইল বাদ দেবে । --- খ) প্রত্যয়টির কোনও অক্ষর যদি উচ্চতর ক্ষেত্রে হয় তবে এটি পিডিএফ ফাইলগুলি মুছবে। --- গ) এর আউটপুট ব্যবহার করা ভাল ধারণা নয় ls
। এটি নিউলাইনযুক্ত ফাইলের নামের সাথে কাজ করবে না। ls
বিশেষ অক্ষরের প্রতিস্থাপনের কিছু বাস্তবায়ন যেমন ট্যাব দ্বারা ?
। --- এটা ব্যবহার করা উত্তম: find -maxdepth 1 -print0
। (এতটা সংক্ষিপ্ত নয় ls
:) ----- একটি সমাধান করতে) এবং খ) grep -vi '\.pdf$'
--- সম্পূর্ণ (তবে কেবল জিএনইউ) সমাধানটি ব্যবহার করুন:find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
| head -20
থাকে তবে আপনি এটি দেখতে মোটামুটি সঠিক বলে মনে করছেন কিনা, তবে আপনি যদি ঠিক থাকেন তবে আপনার rm my_pattern
কোনও বড় ভুল চিহ্নিত করার সুযোগ নেই।
find . -type f ! -name "*.pdf"
কনসোলে মুদ্রণের জন্য, বা কম বা কোনও ফাইলের পাইপ ব্যবহার করতে পারেন । [এবং তারপরে পাবুকের মতামত পছন্দ করার মতো xmgs to rm টি পাইপ করুন (প্রিন্ট সহ 0 | ... -অদ্ভুত ফাইলের নামগুলির সাথে)]
আমি সাধারণত ইন্টারেক্টিভ পাইথন দোভাষী থেকে এ জাতীয় সমস্যাগুলি সমাধান করি:
mic@mic ~ $ python
>>> import os
>>> for f in os.listdir('.'):
... if not f.endswith('.pdf'):
... os.remove(f)
এটির সাথে একটি এক-লাইনের চেয়ে দীর্ঘতর হতে পারে find
বা xargs
, কিন্তু এটা অত্যন্ত প্রাণবন্ত, এবং আমি জানি এটা ঠিক কি না, প্রথমে এটি খোঁজ খবর নেন না করেও।
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)
python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
এই প্রশ্নের আরও ভাল উত্তর (আমার আগের উত্তরের তুলনায়) শক্তিশালী file
কমান্ড ব্যবহার করে হবে ।
$ file -i abc.pdf
abc: application/pdf; charset=binary
এখন আপনার সমস্যা:
cd <the directory you want to search in>
for var in ./*
do
if file -i "$var" | grep -q 'application/pdf\;'
then
echo "$var"
fi
done
for
কমান্ডের কাজটি ভেরিয়েবল আকারে ফাইলগুলি বর্তমান ডিরেক্টরিতে দেওয়া হয় $var
। if-then
কমান্ডটি কমান্ড 0
থেকে প্রস্থান স্থিতি নিয়ে পিডিএফ ফাইলগুলির নাম আউটপুট করে file -i "$var" | grep -q 'application/pdf\;'
, এটি 0
পিডিএফ ফাইলগুলি সন্ধান করলেই প্রস্থান স্থিতি দেয় ।
rm $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')
সতর্কবাণী! প্রথমে ভাল চেষ্টা করুন
ls -l $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')
-i
সঙ্গে grep
কেস-অবশ মিলের জন্য।
rm -i -- !(*@(a|x).pdf)
হিসাবে পড়ুন, সমস্ত ফাইলগুলি যা নেই a.pdf
বা সরান x.pdf
।
এটি 2 টি বর্ধিত গ্লোব ব্যবহার করে কাজ করে, বহির্মুখী !()
গ্লোবকে অস্বীকার করার জন্য যা নিজেই প্রয়োজন যে গ্লোবকে অবশ্যই প্রত্যয়টির আগে এক বা একাধিক a
বা x
প্যাটার্নের সাথে মেলে .pdf
। দেখুন উল্লিখিত glob # extglob ।
$ ls -a
.dotfile1 .dotfile2 a.pdf x.pdf y.zip z.mp3
$ echo -- !(a.pdf)
-- x.pdf y.zip z.mp3
$ echo -- !(x.pdf)
-- a.pdf y.zip z.mp3
$ echo -- !(a.pdf|x.pdf)
-- y.zip z.mp3
$ echo -- !(@(a|x).pdf) # NOTE.that this matches the .dotfiles* as well
-- . .. .dotfile1 .dotfile2 y.zip z.mp3
$ echo -- !(*@(a|x).pdf) # but this doesn't
-- y.zip z.mp3
$ echo rm -i -- !(*@(a|x).pdf)
rm -i -- y.zip z.mp3
$ ksh -c 'for i in ./*; do case $i in *.pdf)continue;; *)rm "$i";; esac;done'
প্রায় কাছাকাছি POSIX এবং কোন বোর্ন ধাঁচের শেল সঙ্গে সামঞ্জস্যপূর্ণ ( ksh
, bash
, dash
)। পোর্টেবল স্ক্রিপ্টগুলির জন্য উপযুক্ত এবং যখন আপনি bash
এর বর্ধিত শেল গ্লোববিং ব্যবহার করতে পারবেন না ।
$ perl -le 'opendir(my $d,"."); foreach my $f (grep(-f && !/.pdf/ , readdir($d))){unlink $f};closedir $d'
বা সামান্য ক্লিনার:
$ perl -le 'opendir(my $d,"."); map{ unlink $_ } grep(-f "./$_" && !/.pdf/ , readdir($d));closedir $d'
python -c 'import os;map(lambda x: os.remove(x), filter(lambda x: not x.endswith(".pdf"),os.listdir(".")))'
আপনি যা মুছে ফেলছেন সে সম্পর্কে সাবধান!
মুছে ফেলার চেষ্টা করার আগে এটির পরীক্ষার একটি নিরাপদ উপায় হ'ল প্রথমে এটি পরীক্ষা করা ls
, কারণ কিছু অনাবৃত আচরণ অযাচিত ফাইলগুলি মুছতে পারে। এবং আপনি এটি সরাসরি ডিরেক্টরি বাইরে করতে পারেন। ls
অনুরূপ rm
, তাই:
ls sub/path/to/files/!(*.pdf)
এটি তালিকাবদ্ধ করবে
y.zip
z.mp3
এবং এখন আপনি যা মুছছেন তা দেখতে পারেন এবং সেগুলি নিরাপদে মুছতে পারেন:
rm sub/path/to/files/!(*.pdf)
এবং এটাই. *
আপনি কেবল প্রোগ্রামিং কোর্স নথি রাখার মতো আরও নির্বাচনী হতে ওয়াইল্ডকার্ড ব্যবহার করতে পারেন :
rm sub/path/to/files/!(*programming*)
.
মানে "এবং"?!
এর অর্থ "ব্যতীত"-name
বোঝায় যে আপনি একটি নাম প্যারামিটার দ্বারা বাদ দিতে চান এবং তারপরে-delete
কী পদক্ষেপ নেওয়া উচিত? সুতরাং এটি "* .pdf" ব্যতীত সমস্ত কিছুর সন্ধান করে এবং সেগুলি মুছে ফেলে? নাকি আমি ভুল বুঝেছি?