ডিরেক্টরিতে এক্সটেনশন পিডিএফ সহ ফাইলগুলি বাদে সমস্ত ফাইল মুছুন


50

আমার একটি ডিরেক্টরি রয়েছে যার মধ্যে নিম্নলিখিত রয়েছে:

x.pdf
y.zip
z.mp3
a.pdf

আমি x.pdfএবং এর বাইরে সমস্ত ফাইল মুছতে চাই a.pdf। টার্মিনাল থেকে আমি এটি কীভাবে করব? কোনও উপ-ডিরেক্টরি নেই তাই কোনও পুনরাবৃত্তির প্রয়োজন নেই।

উত্তর:


63
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

উত্তরের জন্য ধন্যবাদ. আপনি কি আমাকে সিনট্যাক্সটি একটু বুঝতে সাহায্য করতে পারেন? .মানে "এবং"? !এর অর্থ "ব্যতীত" -nameবোঝায় যে আপনি একটি নাম প্যারামিটার দ্বারা বাদ দিতে চান এবং তারপরে -deleteকী পদক্ষেপ নেওয়া উচিত? সুতরাং এটি "* .pdf" ব্যতীত সমস্ত কিছুর সন্ধান করে এবং সেগুলি মুছে ফেলে? নাকি আমি ভুল বুঝেছি?
jessenorton

.মানে বর্তমান ডিরেক্টরি। !এর অর্থ .pdfশেষ ফাইলটি বাদে সমস্ত ফাইল নেওয়া । -deleteএটি মুছে ফেলা মানে। আমি কি এখন পরিষ্কার?
এডওয়ার্ড টরভাল্ডস

@ এটারডন স্টারকরা বলেছিলেন যে এখানে কোনও উপ-ডিরেক্টরি নেই ill আমার উত্তরটি আরও বিস্তৃত হিসাবে বদলাতে হবে
এডওয়ার্ড টরভাল্ডস

+1 -maxdepth 1শুরু করার সাথে আপনার প্যারামিটারটি অন্তর্ভুক্ত করা উচিত ছিল । তারপরে কেউ পুনরাবৃত্তভাবে মুছতে চাইলে প্যারামিটারটি সরিয়ে ফেলার পরামর্শ দিন।
তুলিনাস কর্ডোভা

3
এটি আমার নজরে এনেছে যে আমাদের -inameপরিবর্তে আমাদের ব্যবহার করা উচিত -nameবা .PDFএক্সটেনশন হিসাবে ফাইলগুলি স্লিপ হয়ে যাবে।
মুরু

43

সঙ্গে bash'বর্ধিত শেল globbing গুলি, আপনি ছাড়া অন্য এক্সটেনশনগুলি সহ কোনো ফাইল মুছে ফেলুন পারে .pdfব্যবহার

rm -- *.!(pdf)

@ পিটিএস দ্বারা উল্লিখিত হিসাবে, --অক্ষরগুলি কোনও কমান্ড বিকল্পের সমাপ্তি নির্দেশ করে, ফাইলগুলির বিরল ক্ষেত্রে যাদের নাম একটি -অক্ষর দিয়ে শুরু হয় সেই ক্ষেত্রে কমান্ডটি নিরাপদ করে তোলে ।

আপনি যদি কোনও এক্সটেনশন ছাড়াই ফাইলগুলি এবং সেইসাথে অন্য এক্সটেনশানযুক্ত ফাইলগুলি মুছতে চান .pdfতবে @ ডেনিসউইলিয়ামসন দ্বারা চিহ্নিত হিসাবে আপনি ব্যবহার করতে পারেন

rm -- !(*.pdf)

বর্ধিত গ্লোববিং ডিফল্টরূপে সক্ষম করা উচিত, তবে তা না হলে আপনি এটি ব্যবহার করে তা করতে পারেন

shopt -s extglob

বিশেষত যদি আপনি এটি কোনও স্ক্রিপ্টের অভ্যন্তরে ব্যবহারের উদ্দেশ্যে নিয়ে থাকেন তবে এটি লক্ষণীয় গুরুত্বপূর্ণ যে যদি অভিব্যক্তিটি কোনও কিছুর সাথে মেলে না (যেমন ডিরেক্টরিতে কোনও নন-পিডিএফ ফাইল নেই) তবে ডিফল্টরূপে গ্লোবটি অপরিবর্তিতভাবে পাস হবে rmকমান্ড, এর মত একটি ত্রুটি ফলাফল

rm: cannot remove `*.!(pdf)': No such file or directory

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


ভাল পদ্ধতির আইএমও।
তাকাকাত

এক্সটেনশন ছাড়াই ফাইলগুলির কী হবে? এফডব্লিউআইডাব্লু, জেডএস-এ এটিrm *~*.pdf
এমিল জেবেক

1
আমি বিন্যাসটি প্রথম বন্ধনীর ভিতরে রাখতাম।
ডেনিস উইলিয়ামসন

4
আহ, তারকাচিহ্ন এছাড়াও ভিতরে যেতে হবে: !(*.py)। এছাড়াও, সম্ভবতঃ, যদি ওপি কেবল ".pdf" ফাইলগুলি বাকী রাখতে চায়, তবে এক্সটেনশান ছাড়াই থাকা ফাইলগুলিও মুছে ফেলা উচিত এবং এড়ানো হবে না।
ডেনিস উইলিয়ামসন

1
এই পদ্ধতির গ্রহণযোগ্য উত্তরের চেয়ে সহজ এবং পরিষ্কার।
পিটার

18

ট্র্যাশে মুছুন :

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)

অথবা mvকমান্ডের মাধ্যমে (তবে আপনি ট্র্যাশ থেকে এটি পুনরুদ্ধার করতে পারবেন না কারণ এটি .trashinfo তথ্য রেকর্ড করে না, সুতরাং এর অর্থ আপনি আপনার ফাইলগুলি এমন কোনও গন্তব্যে সরিয়ে নিয়েছেন যেখানে এটি নীচের মতো রয়েছে)।

mv !(*.pdf) ~/.local/share/Trash/files

6
এই ব্যবহারটি সরাসরি ব্যবহারের চেয়ে অনেক বেশি নিরাপদ rm
শেঠ

14

সবচেয়ে সহজ পদ্ধতির: কোথাও অন্য ডিরেক্টরি তৈরি করুন (যদি আপনি কেবল একটি ডিরেক্টরিতে মুছছেন তবে পুনরাবৃত্তি না করে, এটি এমনকি উপ-ডিরেক্টরিও হতে পারে); সমস্ত .pdf আছে সেখানে সরান; অন্য সব মুছুন; পিডিএফ এর পিছনে সরানো; মধ্যবর্তী ডিরেক্টরি মুছুন।

দ্রুত, সহজ, আপনি ঠিক কী করছেন তা দেখতে পাবেন। আপনি যে ডিরেক্টরিটি পরিষ্কার করছেন সেটির মধ্যবর্তী ডিরেক্টরিটি একই ডিভাইসে রয়েছে তা নিশ্চিত করুন যাতে চলাচলের নাম পরিবর্তিত হয়, অনুলিপিগুলি হয় না!


4
+1 আবার এমন একটি মন্তব্যে যা নবজাতী ব্যবহারকারীদের কাছে বোধগম্য হয়, এটি অবশ্যই অনিচ্ছাকৃতভাবে ফাইলগুলি মুছতে পারে না।
2:54

4

ব্যাশের গ্লোবগনোর ব্যবহার করুন:

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

3

সাবধান এবং রচনা করুন: এক্সার্গস ব্যবহার করুন

এখানে আমি পছন্দ করি এমন একটি পদ্ধতির কারণ এটি আমাকে খুব সাবধানতা অবলম্বন করতে দেয়: আমি যে ফাইলগুলি মুছতে চাইছি কেবল তা দেখানোর জন্য একটি উপায় রচনা করুন, তারপরে সেগুলি rmব্যবহারে প্রেরণ করুন xargs। উদাহরণ স্বরূপ:

  • ls আমাকে সব দেখায়
  • ls | grep pdfআমি যে ফাইলগুলি রাখতে চাই তা আমাকে দেখায়। হুম।
  • ls | grep -v pdfবিপরীতটি দেখায়: আমি যা রাখতে চাই তা ব্যতীত সমস্ত । অন্য কথায়, এটি মুছে ফেলতে চাই এমন জিনিসগুলির তালিকা প্রদর্শন করে। বিপজ্জনক কিছু করার আগে আমি এটি নিশ্চিত করতে পারি।
  • ls | grep -v pdf | xargs rmrmমুছে ফেলার জন্য ঠিক সেই তালিকাটি প্রেরণ করে

যেমনটি আমি বলেছি, এটি প্রধানত এটির যে সুরক্ষা সরবরাহ করে তা rm *জন্য আমি এটি পছন্দ করি: আমার জন্য কোনও দুর্ঘটনা নেই । অন্য দুটি সুবিধা:

  • এটি কম্পোজেবল; আপনি পছন্দ হিসাবে আপনি ব্যবহার করতে পারেন lsবা findপ্রাথমিক তালিকা পেতে পারেন । এই তালিকাটি সংকীর্ণকরণের প্রক্রিয়ায় আপনি নিজের পছন্দ মতো অন্য যে কোনও কিছু ব্যবহার করতে পারেন - অন্য grep, কিছু awkবা কিছু হোক। আপনার যদি কেবল সেই ফাইলগুলিকে মুছতে হয় যার নামগুলিতে একটি রঙ থাকে তবে আপনি এটি একইভাবে তৈরি করতে পারেন।
  • আপনি প্রতিটি সরঞ্জাম এর মূল উদ্দেশ্যে ব্যবহার করতে পারেন। আমি findসন্ধানের জন্য এবং rmঅপসারণের জন্য ব্যবহার করতে পছন্দ করি , এটি মনে রাখতে হবে যে findকোনও -deleteপতাকা গ্রহণ করে । এবং আপনি যদি এটি করেন তবে আবার আপনি বিকল্প সমাধান রচনা করতে পারেন; এর পরিবর্তে rm, আপনি একটি trashকমান্ড তৈরি করতে পারেন যা ফাইলটিকে ট্র্যাশে স্থানান্তরিত করে ("অপসারণের অনুমতি দেয়") এবং এর পরিবর্তে পাইপটি তৈরি করতে পারে rm। আপনার কাছে findসেই বিকল্পটি সমর্থন করার দরকার নেই , আপনি কেবল এটিতে পাইপ করুন।

হালনাগাদ

ফাইলের নামগুলিতে লাইন বিরতি, ফাইলের নাম my_pdfs.zipইত্যাদির মতো কিছু প্রান্তের কেসগুলি হ্যান্ডেল করতে কীভাবে এটি পরিবর্তন করতে পারে তার জন্য @ পাবউকের মন্তব্য দেখুন comments


4
আমি এখানে তিনটি সমস্যা লক্ষ্য করেছি: ক)pdf এটির নামের যে কোনও ফাইল বাদ দেবে । --- খ) প্রত্যয়টির কোনও অক্ষর যদি উচ্চতর ক্ষেত্রে হয় তবে এটি পিডিএফ ফাইলগুলি মুছবে। --- গ) এর আউটপুট ব্যবহার করা ভাল ধারণা নয় ls। এটি নিউলাইনযুক্ত ফাইলের নামের সাথে কাজ করবে না। lsবিশেষ অক্ষরের প্রতিস্থাপনের কিছু বাস্তবায়ন যেমন ট্যাব দ্বারা ?। --- এটা ব্যবহার করা উত্তম: find -maxdepth 1 -print0। (এতটা সংক্ষিপ্ত নয় ls:) ----- একটি সমাধান করতে) এবং খ) grep -vi '\.pdf$'--- সম্পূর্ণ (তবে কেবল জিএনইউ) সমাধানটি ব্যবহার করুন:find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
পাবউক

1
আমি বুঝতে পারি যে আপনি সমাধানটিকে একাধিক ম্যানুয়াল পুনরাবৃত্তির সাথে "ইন্টারেক্টিভ" প্রক্রিয়া হিসাবে বোঝাতে চেয়েছিলেন তবে ফাইলগুলির দীর্ঘ তালিকার জন্য চেকগুলি খুব সহজেই ব্যবহারযোগ্য হবে এবং উপরে উল্লিখিত সমস্যাগুলি ভুলগুলি উপেক্ষা করা সহজতর করতে পারে।
পাবউক

1
@ পাবউক ভাল পয়েন্ট; বাস্তব বিশ্ব সবসময় জিনিসগুলিকে জটিল করে তোলে এবং আপনার সংশোধনগুলি সহায়ক। :) তবে আমি এখনও এই সামগ্রিক পদ্ধতির সেরা বলে মনে করি। যদি দৃষ্টিগোচরভাবে সবকিছু নিশ্চিত করার জন্য অনেকগুলি ফাইল | head -20থাকে তবে আপনি এটি দেখতে মোটামুটি সঠিক বলে মনে করছেন কিনা, তবে আপনি যদি ঠিক থাকেন তবে আপনার rm my_patternকোনও বড় ভুল চিহ্নিত করার সুযোগ নেই।
নাথান লং

1
ফাইলগুলি মুছে ফেলার আগে আপনি ফাইলগুলি দেখাতে পারেন, ডিলিটটি ছেড়ে যান এবং find . -type f ! -name "*.pdf"কনসোলে মুদ্রণের জন্য, বা কম বা কোনও ফাইলের পাইপ ব্যবহার করতে পারেন । [এবং তারপরে পাবুকের মতামত পছন্দ করার মতো xmgs to rm টি পাইপ করুন (প্রিন্ট সহ 0 | ... -অদ্ভুত ফাইলের নামগুলির সাথে)]
Xen2050

3

আমি সাধারণত ইন্টারেক্টিভ পাইথন দোভাষী থেকে এ জাতীয় সমস্যাগুলি সমাধান করি:

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)
জ্যাকব Vlijm

python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
mic_e

[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
mic_e

চমৎকার! দ্বিতীয়টি আমাকে একটি সিনট্যাক্স ত্রুটি দেয়, কেন তা দেখবেন না।
জ্যাকব ভিলিজ

অদ্ভুত; এটি আমার সিস্টেমে অজগর 3.4 এবং পাইথন 2.7 উভয়ের সাথে কাজ করে।
mic_e

2

এই প্রশ্নের আরও ভাল উত্তর (আমার আগের উত্তরের তুলনায়) শক্তিশালী 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কমান্ডের কাজটি ভেরিয়েবল আকারে ফাইলগুলি বর্তমান ডিরেক্টরিতে দেওয়া হয় $varif-thenকমান্ডটি কমান্ড 0থেকে প্রস্থান স্থিতি নিয়ে পিডিএফ ফাইলগুলির নাম আউটপুট করে file -i "$var" | grep -q 'application/pdf\;', এটি 0পিডিএফ ফাইলগুলি সন্ধান করলেই প্রস্থান স্থিতি দেয় ।


1
rm $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')

সতর্কবাণী! প্রথমে ভাল চেষ্টা করুন

ls -l $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')

2
ওহ , এটি এতগুলি উপায়ে ত্রুটিযুক্ত: ছোটো.রুহর্দার / আওয়ার্ড। Html # ls , ছোটো.রুহআরডি / ওয়ার্ড। Html # grep এবং এটি সাদা স্থান বা বিশেষ অক্ষরের সাথে ফাইলের নামগুলি সম্পূর্ণ উপেক্ষা করে।
ডেভিড ফোস্টার

1
আপনি সত্যিই ব্যবহার করা উচিত -iসঙ্গে grepকেস-অবশ মিলের জন্য।
মুরু

1
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

1

বহনযোগ্য শেল উপায়

$ ksh -c 'for i in ./*; do case $i in *.pdf)continue;; *)rm "$i";; esac;done'

প্রায় কাছাকাছি POSIX এবং কোন বোর্ন ধাঁচের শেল সঙ্গে সামঞ্জস্যপূর্ণ ( ksh, bash, dash)। পোর্টেবল স্ক্রিপ্টগুলির জন্য উপযুক্ত এবং যখন আপনি bashএর বর্ধিত শেল গ্লোববিং ব্যবহার করতে পারবেন না ।

Perl:

$ 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(".")))'

0

আপনি যা মুছে ফেলছেন সে সম্পর্কে সাবধান!

মুছে ফেলার চেষ্টা করার আগে এটির পরীক্ষার একটি নিরাপদ উপায় হ'ল প্রথমে এটি পরীক্ষা করা 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*)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.