আরএম, সিপি, এমভি কমান্ডের জন্য আর্গুমেন্টের তালিকা খুব দীর্ঘ ত্রুটি


629

ইউনিক্সের একটি ডিরেক্টরিতে আমার বেশ কয়েকটি শতাধিক পিডিএফ রয়েছে। পিডিএফগুলির নামগুলি সত্যিই দীর্ঘ (প্রায় 60 টি অক্ষর)।

যখন আমি নীচের কমান্ডটি ব্যবহার করে সমস্ত পিডিএফ একসাথে মুছে ফেলার চেষ্টা করি:

rm -f *.pdf

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

/bin/rm: cannot execute [Argument list too long]

এই ত্রুটির সমাধান কী? এই ত্রুটিটিও ঘটায় mvএবং cpআদেশগুলিও কি ঘটে ? যদি হ্যাঁ, এই আদেশগুলি কীভাবে সমাধান করবেন?


21
আপনি এই লিঙ্কটি দরকারী খুঁজে পেতে পারেন
another.anon.coward


1
এছাড়াও এটি প্রাসঙ্গিক হতে পারে http://mywiki.wooledge.org/BashFAQ/095
লোরেঞ্জো বেলি

4
@jww: এবং আমি এত বছর ধরে ভাবতে থাকি যে বাশটি "প্রোগ্রামাররা সাধারণত ব্যবহৃত সফ্টওয়্যার সরঞ্জামগুলির" অধীনে চলে আসে - এমন একটি বিভাগ যেখানে এখানে প্রশ্ন করা যেতে পারে!
ভিকি

@ নিক - "... স্ক্রিপ্টে" যুক্ত করা বাধ্যতামূলক নয়। যখন সমস্যাটি ন্যূনতম, সম্পূর্ণ, এবং যাচাইযোগ্য উদাহরণে কমে যায়, তখন এটি কোনও কমান্ডটি কীভাবে চালানো যায় সে সম্পর্কে একটি প্রশ্ন। যদি আমি স্পষ্ট কিছু মিস করছি তবে আমার ক্ষমা চাই।
jww

উত্তর:


876

এটি হওয়ার কারণ হ'ল বাশ প্রকৃতপক্ষে প্রতিটি মিলিত ফাইলে নক্ষত্রকে প্রসারিত করে একটি দীর্ঘ দীর্ঘ কমান্ড লাইন তৈরি করে।

এটা চেষ্টা কর:

find . -name "*.pdf" -print0 | xargs -0 rm

সতর্কতা: এটি একটি পুনরাবৃত্ত অনুসন্ধান এবং এটি উপ-ডিরেক্টরিতেও ফাইল (এবং মুছুন) সন্ধান করবে। উপর ট্যাক -frm কমান্ড শুধুমাত্র যদি আপনি কি নিশ্চিতরূপে নিশ্চিতকরণ চাই না হয়।

কমান্ডটি পুনরাবৃত্তি করার জন্য আপনি নিম্নলিখিতটি করতে পারেন:

find . -maxdepth 1 -name "*.pdf" -print0 | xargs -0 rm

অন্য বিকল্পটি হ'ল -deleteসন্ধানের পতাকাটি ব্যবহার করা :

find . -name "*.pdf" -delete

7
না, xargsতালিকাটি বিশেষভাবে বিভক্ত করে এবং প্রয়োজনে বেশ কয়েকটি কমান্ড জারি করে issues
ট্রিপলি

7
@ ডেনিস: -maxdepth 1পথের পরে প্রথম যুক্তি হওয়া দরকার।
বার্টন চিত্তেনডেন

54
-deleteসন্ধানকারী ফাইলগুলি মুছে ফেলার জন্য একটি পতাকা রয়েছে এবং এটি এখনও না হলেও এটি -execxargs (যা এখন 3 টি প্রক্রিয়া এবং একটি একক প্রক্রিয়া পরিবর্তে একটি পাইপের সাহায্যে) পরিবর্তে আরএম কার্যকর করতে ব্যবহার করা ভাল অনুশীলন হিসাবে বিবেচিত হবে -deleteঅথবা 2 টি প্রক্রিয়া সহ -exec)।
স্ক্রাগার

3
@ এডওয়ার্ড লোপেজ ... তবে এটি নূ-সীমিত ইনপুটটি পড়ছে। এবং dangerous (broken, exploitable, etc.)পুরোটি, মোটামুটি হাস্যকর। নিঃসন্দেহে আপনার ব্যবহারের সময় সতর্কতা অবলম্বন করা উচিত xargsতবে এটি যথেষ্ট নয় eval/evil
মনিকা পুনরায় ইনস্টল করুন দয়া করে

4
@scragar -execকল করার সাথে সাথে rmপ্রক্রিয়াগুলির সংখ্যা 1 + ফাইলের সংখ্যা হবে, যদিও এটি থেকে সমবর্তী প্রক্রিয়াগুলির সংখ্যা 2 হতে পারে (সম্ভবত এটি মিলিয়ে rm প্রসেসগুলি কার্যকর করতে পারে)। ব্যবহারের প্রক্রিয়াগুলির সংখ্যা xargsনাটকীয়ভাবে 2 + n এ কমিয়ে দেওয়া হবে, যেখানে এন কিছু সংখ্যক প্রক্রিয়া ফাইলের সংখ্যার চেয়ে কম (ফাইলগুলির সংখ্যা / 10 বলুন, যদিও পাথের দৈর্ঘ্যের উপর নির্ভর করে সম্ভবত)। ধরে নিলে সরাসরি মুছে ফেলা -deleteহবে , এটি ব্যবহার করা কেবলমাত্র প্রক্রিয়া হওয়া উচিত should
নিউরালমার

396

TL; ড

কমান্ড লাইন আর্গুমেন্টের আকারে এটি কার্নেলের সীমাবদ্ধতা। forপরিবর্তে একটি লুপ ব্যবহার করুন।

সমস্যার উত্স

এটি সম্পর্কিত execveএবং ARG_MAXধ্রুবক একটি সিস্টেম সমস্যা । সে সম্পর্কে প্রচুর ডকুমেন্টেশন রয়েছে (দেখুন ম্যান এক্সিকিউটেড , ডেবিয়ানের উইকি )।

মূলত, প্রসারণটি একটি কমান্ড তৈরি করে (এর পরামিতি সহ) যা ARG_MAXসীমা অতিক্রম করে । কার্নেলে 2.6.23, সীমাটি সেট করা হয়েছিল 128 kB। এই ধ্রুবকটি বাড়ানো হয়েছে এবং আপনি নির্বাহের মাধ্যমে এর মান পেতে পারেন:

getconf ARG_MAX
# 2097152 # on 3.5.0-40-generic

সমাধান: forলুপ ব্যবহার করা

বাশফিউএইউ / 095 এfor প্রস্তাবিত হিসাবে একটি লুপ ব্যবহার করুন এবং র‌্যাম / মেমরির স্থান ব্যতীত আর কোনও সীমা নেই:

শুকনো রান তা নিশ্চিত করার জন্য এটি আপনার প্রত্যাশাকে মুছে ফেলবে:

for f in *.pdf; do echo rm "$f"; done

এবং এটি কার্যকর:

for f in *.pdf; do rm "$f"; done

এছাড়াও এটি পোর্টেবল পদ্ধতি হ'ল শেলগুলির মধ্যে গ্লোবের দৃ strong় এবং সংবিধানমূলক আচরণ রয়েছে ( পসিক্স স্পেকের অংশ )।

দ্রষ্টব্য: বেশ কয়েকটি মন্তব্য দ্বারা উল্লিখিত হিসাবে, এটি প্রকৃতপক্ষে ধীর কিন্তু আরও রক্ষণাবেক্ষণযোগ্য কারণ এটি আরও জটিল পরিস্থিতিগুলিকে মানিয়ে নিতে পারে, উদাহরণস্বরূপ যেখানে কেউ কেবলমাত্র এক ক্রিয়াকলাপের চেয়ে বেশি কিছু করতে চান।

সমাধান: ব্যবহার find

যদি আপনি জেদ করেন তবে আপনি ব্যবহার করতে পারেন findতবে সত্যই xargs ব্যবহার করবেন না কারণ এটি "বিপজ্জনক (ভাঙ্গা, শোষণযোগ্য, ইত্যাদি) নন-এনইউএল-সীমিত না হওয়া ইনপুট পড়ার সময়" :

find . -maxdepth 1 -name '*.pdf' -delete 

ব্যবহার -maxdepth 1 ... -deleteপরিবর্তে -exec rm {} +পারবেন findকেবল, অত দ্রুত (ধন্যবাদ একটি বহিস্থিত প্রক্রিয়া ব্যবহার না করেই প্রয়োজনীয় ব্যবস্থা কল নিজেই চালানো @chepner মন্তব্য )।

তথ্যসূত্র


31
দুর্দান্ত উত্তর, সমস্ত এসও প্রশ্নের উত্তর এভাবেই দেওয়া উচিত। ধন্যবাদ!
টমড

1
forলুপ উল্লেখ করার জন্য +1 । আমি findআগে ব্যবহার করেছি , তবে আমি সবসময় বিকল্পগুলি ইত্যাদি ভুলে যাওয়ার সাথে সাথে এটি কীভাবে করব তা সবসময় সন্ধান করছি। forIMHO
রবার্ট ডন্ডন

3
এটি for f in *; do rm "$f"; done
মোহন

3
find -execসমাধান অনেক দ্রুত চেয়ে মনে করা হয় forলুপ।
ত্রিশ

2
পাঁচ বছর পরে 4.15.0 এ ( 4.15.0-1019-gcpসঠিক হবে) এবং সীমা যথেষ্ট উত্সাহের ব্যাপার হল, 2097152. এ এখনও লিনাক্স Git রেপো উপর ARG_MAX অনুসন্ধানের জন্য দেখানোর সময় একটি ফলাফল দেয় ARG_MAX 131702. এ হতে
ম্যাট এম

181

findএকটি -deleteক্রিয়া আছে:

find . -maxdepth 1 -name '*.pdf' -delete

4
এটি "আর্গুমেন্টের তালিকা খুব দীর্ঘ" ফিরিয়ে দেবে। অন্তত আমার জন্য এটি। xargsডেনিসের উত্তর অনুসারে ব্যবহার করা , উদ্দেশ্য অনুযায়ী কাজ করে।
সেরজিও

7
এটি অনুসন্ধানে বাগের মতো শোনাচ্ছে।
চোরমাস্টার

3
@ সার্জিওর একই সমস্যা ছিল, এটি নাম প্যাটার্নের আশেপাশে হারিয়ে যাওয়া উক্তিগুলির কারণে হয়েছিল।
লাক্সিয়ান

হ্যাঁ, কেন জিনিসগুলি সন্ধানের জন্য একটি সরঞ্জাম এমনকি মুছে ফেলার জন্য একটি স্যুইচ আছে? এটি কি কেবলমাত্র আমিই যিনি অপ্রয়োজনীয় এবং বিপজ্জনক বলা অপ্রয়োজনীয় বলে মনে করেন?
গণিত পাঠক

2
@ ম্যাথ্রেডলার এটিকে সত্য বোঝায় যে একটি সাধারণ ব্যবহারের ক্ষেত্র হ'ল -execএকগুচ্ছ ফাইলগুলি মুছে ফেলা। -exec rm {} +একই জিনিসটি করতে পারে তবে কমপক্ষে একটি বাহ্যিক প্রক্রিয়া শুরু করা দরকার। কোনও বাহ্যিক মোড়ক ব্যবহার না করে প্রয়োজনীয় সিস্টেম কলকে কেবল কার্যকর -deleteকরতে অনুমতি দেয় find
চিপনার

21

আরেকটি উত্তর হ'ল xargsব্যাচগুলিতে কমান্ডগুলি প্রক্রিয়া করতে বাধ্য করা। উদাহরণস্বরূপ deleteফাইলগুলিতে 100একবারে cdডিরেক্টরিতে যান এবং এটি চালান:

echo *.pdf | xargs -n 100 rm


4
লিনাক্সে কমান্ড মুছে ফেলার জন্য, যা আপনি প্রকৌশলী হয়ে থাকেন এবং আপনি যদি ভুল লিখেছেন তবে এটি একটি বিপর্যয় হতে পারে, আমি বিশ্বাস করি এটি 'নিরাপদ এবং আমি জানি যে কী চলছে' সবচেয়ে ভাল। অভিনব জিনিস নয় যে আপনি যদি কোনও বিন্দু টাইপ না করে থাকেন তবে আপনার সংস্থার এক মিনিটের মধ্যেই এটি ক্র্যাশ হয়ে যাবে।
কৃত্রিমভাবে উদ্বেগ

1
নির্দিষ্ট কমান্ডের জন্য আমরা কীভাবে এটি ডিফল্ট সম্প্রসারণ করতে পারি? অনেকগুলি "স্ট্যান্ডার্ড" লিনাক্স কমান্ড রয়েছে যেখানে এটি একবারে তাদের সমস্ত প্রয়োজন হয় কিনা বা না ("আরএম" এর মতো)
ব্যবহারকারী 1212212

1
মনে রাখবেন যে এটি কেবল যেখানে echoশেল অন্তর্নির্মিত সেখানে কাজ করে । যদি আপনি কমান্ডটি ব্যবহার করে শেষ করেন echo, আপনি এখনও প্রোগ্রাম আর্গুমেন্ট সীমাতে চলে যাবেন।
টবি স্পিড

14

অথবা আপনি চেষ্টা করতে পারেন:

find . -name '*.pdf' -exec rm -f {} \;

এটি উপ-ডিরেক্টরি থেকে ফাইলগুলিও মুছে দেয় dele কীভাবে তা প্রতিরোধ করবেন?
ভিকি

@ নিকুঞ্জচৌহান অ্যাড-ম্যাক্সডেপথ বিকল্প:find . -maxdepth 1 -name '*.pdf' -exec rm -f {} \;
জন লিন

আমি সর্বাধিক বিকল্প সন্নিবেশ করতে সক্ষম নই
ভিকি

উপরের (নির্বাচিত উত্তর) @ ডেনিসের উত্তর অনুসারে এই বিকল্পটি লিনাক্স-কেবল বিকল্প হতে পারে।
jvriesem

12

আপনি যদি একসাথে খুব বেশি সংখ্যক ফাইল মুছে ফেলার চেষ্টা করছেন (আমি আজ ৪৮৫,০০০+ এর সাথে একটি ডিরেক্টরি মুছে ফেলেছি) তবে আপনি সম্ভবত এই ত্রুটির মধ্যে চলে যাবেন:

/bin/rm: Argument list too long.

সমস্যা হল যখন আপনি ভালো কিছু টাইপ rm -rf *, *, যে ম্যাচিং ফাইলের একটি তালিকা দিয়ে প্রতিস্থাপিত হয় "RM -rf file1 file2 file3 file4" ইত্যাদি মত। এই আর্গুমেন্টের তালিকা সংরক্ষণের জন্য মেমরির তুলনামূলকভাবে একটি ছোট বাফার রয়েছে এবং যদি এটি পূরণ করা হয় তবে শেলটি প্রোগ্রামটি চালায় না।

এই সমস্যাটি পেতে, অনেক লোক প্রতিটি ফাইল সন্ধানের জন্য ফাইন্ড কমান্ডটি ব্যবহার করে এবং একে একে একে "আরএম" কমান্ডে প্রেরণ করে:

find . -type f -exec rm -v {} \;

আমার সমস্যাটি হ'ল আমার ৫০০,০০০ ফাইল মুছতে হবে এবং এটি অনেক দীর্ঘ সময় নিচ্ছিল।

আমি ফাইলগুলি মুছে ফেলার আরও দ্রুততর পথে হোঁচট খেয়েছি - "ফাইন্ড" কমান্ডটিতে একটি "মুছে ফেলা" পতাকাটি নির্মিত হয়েছে! এখানে আমি যা ব্যবহার করে শেষ করেছি:

find . -type f -delete

এই পদ্ধতিটি ব্যবহার করে, আমি প্রায় 2000 ফাইল / সেকেন্ডের হারে ফাইলগুলি মুছছিলাম - আরও দ্রুত!

আপনি ফাইলের নামগুলি মুছার সাথে সাথে তাও প্রদর্শন করতে পারেন:

find . -type f -print -delete

… বা এমনকি কতগুলি ফাইল মুছে ফেলা হবে তা দেখান, তারপরে সেগুলি মুছতে কতক্ষণ সময় লাগে:

root@devel# ls -1 | wc -l && time find . -type f -delete
100000
real    0m3.660s
user    0m0.036s
sys     0m0.552s

ধন্যবাদ। আমি sudo find . -type f -deleteপ্রায় 485 হাজার ফাইল মুছতে পেরেছিলাম এবং এটি আমার পক্ষে কাজ করে। প্রায় 20 সেকেন্ড সময় নিয়েছে।
নাইজেল অ্যাল্ডারটন

11

আপনি এটি চেষ্টা করতে পারেন:

for f in *.pdf
do
  rm $f
done

সম্পাদনা: থিফমাস্টার মন্তব্যটি আমাকে তরুণ শেলের জেডিগুলিতে এই জাতীয় বিপজ্জনক অনুশীলনটি প্রকাশ না করার পরামর্শ দেয়, তাই আমি আরও একটি "নিরাপদ" সংস্করণ যুক্ত করব (কারও কাছে "-rf। ..Pdf" ফাইল থাকলে জিনিস সংরক্ষণের স্বার্থে)

echo "# Whooooo" > /tmp/dummy.sh
for f in '*.pdf'
do
   echo "rm -i $f" >> /tmp/dummy.sh
done

উপরেরটি চালানোর পরে, কেবল আপনার পক্ষে /tmp/dummy.sh ফাইলটি খুলুন। সম্পাদক এবং বিপজ্জনক ফাইল নামগুলির জন্য প্রতিটি লাইন পরীক্ষা করে দেখুন, যদি পাওয়া যায় তবে তাদের মন্তব্য করুন।

তারপরে আপনার কার্যকারী ডিয়ারে ডামি.এস স্ক্রিপ্ট অনুলিপি করুন এবং এটি চালান।

সুরক্ষা কারণে এই সমস্ত।


5
আমি মনে করি এটি উদাহরণস্বরূপ একটি ফাইল সহ দুর্দান্ত জিনিসগুলি করবে-rf .. .pdf
থিফমাস্টার

হ্যাঁ এটি হবে, তবে সাধারণত শেল ব্যবহার করার সময়, কমান্ডটি প্রদানকারীকে "তিনি কী করছেন" একবার "নজর দেওয়া উচিত :)। আসলে আমি কোনও ফাইলে পুনর্নির্দেশ করতে পছন্দ করি এবং তারপরে প্রতিটি একক সারি পরিদর্শন করি।
বিগমাইক

2
এটি "$ f" উদ্ধৃতি দেয় না। থিফ মাস্টার এটাই বলছিল। -rfঅগ্রাধিকার নেয় -i, সুতরাং আপনার ২ য় সংস্করণ এর চেয়ে ভাল নয় (ম্যানুয়াল পরিদর্শন ছাড়াই)। এবং মূলত প্রতিটি ফাইলের জন্য অনুরোধের কারণে ভর মোছার জন্য অকেজো।
পিটার কর্ডেস

7

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

files=(*.pdf)
for((I=0;I<${#files[@]};I+=1000)); do
    rm -f "${files[@]:I:1000}"
done

এই পদক্ষেপে এটি 1000 ফাইলের ব্যাচে মুছে যাবে se


2
একটি বিশাল সংখ্যক ফাইলের জন্য এটি উল্লেখযোগ্যভাবে দ্রুত বলে মনে হচ্ছে
জেমস টোকনেল


4

RM কমান্ড ফাইল যা আপনি যুগপত অপসারণ করতে পারেন একটি সীমাবদ্ধতা আছে।

আপনার ফাইলের ধরণগুলিতে rm কমান্ড বেসগুলি একাধিকবার ব্যবহার করে আপনি সেগুলি মুছে ফেলতে পারেন possibility

rm -f A*.pdf
rm -f B*.pdf
rm -f C*.pdf
...
rm -f *.pdf

এছাড়াও আপনি তাদের মাধ্যমে অপসারণ করতে পারেন খোঁজ কমান্ড প্রয়োগ করুন:

find . -name "*.pdf" -exec rm {} \;

3
না, rmএটি প্রক্রিয়া করবে এমন ফাইলের সংখ্যার কোনও সীমা নেই (এটি ছাড়া এটি এর argcচেয়ে বড় হতে পারে না INT_MAX)। পুরো আর্গুমেন্ট অ্যারের সর্বাধিক আকারে এটি কার্নেলের সীমাবদ্ধতা (এ কারণেই ফাইলের নামগুলির দৈর্ঘ্য উল্লেখযোগ্য)।
টবি স্পাইট

3

যদি তারা স্পেস বা বিশেষ অক্ষর সহ ফাইলের নাম হয় তবে ব্যবহার করুন:

find -maxdepth 1 -name '*.pdf' -exec rm "{}" \;

এই বাক্যটি বর্তমান ডিরেক্টরিতে (-maxdepth 1) এক্সটেনশন পিডিএফ (-name '* .pdf') সহ সমস্ত ফাইল অনুসন্ধান করে এবং তারপরে, প্রতিটি একটিকে মুছে ফেলুন (-exec rm "{}")।

এক্সপ্রেশন {the ফাইলটির নাম প্রতিস্থাপন করে এবং ""} "স্পেস বা বিশেষ অক্ষর সহ ফাইলের নামটি স্ট্রিং হিসাবে সেট করে।


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

পুরো বিষয়টি -execহ'ল আপনি শেলটি চালাবেন না। এখানে উদ্ধৃতিগুলি কার্যকরভাবে কিছুই করে না। (তারা কোনো ওয়াইল্ডকার্ড বিস্তার এবং স্ট্রিং উপর টোকেন বিভাজন রোধ শেল যেখানে আপনি এই কমান্ডটি লিখুন এ, কিন্তু স্ট্রিং {}কোনো হোয়াইটস্পেস ধারণ করে না বা ওয়াইল্ডকার্ড অক্ষর শেল।)
tripleee

2

ফর্ম উত্স ডিরেক্টরিটি গন্তব্যে অনুলিপি করার সময় আমি একই সমস্যার মুখোমুখি হয়েছিলাম

উত্স ডিরেক্টরিতে ফাইলগুলি ছিল ~ 3 লক্ষ

আমি বিকল্প- আর সিপি ব্যবহার করেছি এবং এটি আমার জন্য কাজ করেছে for

সিপি -আর এবিসি / ডিএফ /

এটি আর্গুমেন্ট তালিকার খুব দীর্ঘস্থায়ী সতর্কতা না দিয়ে সমস্ত ফাইলকে abc থেকে Def এ অনুলিপি করবে


আমি জানি না যে কেন কেউ এটিকে নিম্নমান দিয়েছে, সে সম্পর্কে মন্তব্য না করেও (এটি নীতি, ভাবেন!)। আমাকে একটি ফোল্ডারের ভিতরে থাকা সমস্ত ফাইল মুছতে হবে (প্রশ্নটি পিডিএফ সম্পর্কে নির্দিষ্ট নয়, মনে রাখবেন) এবং তার জন্য, এই কৌশলটি ভালভাবে কাজ করছে, শেষ পর্যন্ত সকলকেই হ'ল ফোল্ডারটি পুনরায় তৈরি করতে হবে যেটি মুছে ফেলা হয়েছিল আমি `আরএম-আর / পাথ / টু / ফোল্ডার ব্যবহার করেছি used
টমাস টেম্পেলম্যান

1
এটি কাজ করে কারণ ওপির ক্ষেত্রে, তিনি * ব্যবহার করছিলেন, যা .pdf এর বিশাল তালিকায় প্রসারিত হয়েছিল, একটি ডিরেক্টরি দেওয়ার ফলে এটি অভ্যন্তরীণভাবে চিকিত্সা করবে, সুতরাং ওপির সমস্যা মোকাবেলা করতে হবে না। আমি মনে করি এটি সেই কারণেই ডাউনভোটেড ছিল। যদি সে তার ডিরেক্টরিতে ডিরেক্টরি বা অন্যান্য ফাইল (পিডিএফ নয়)
নেস্ট করে থাকে তবে ওপির

2

এটি চেষ্টা করে দেখুন আপনি যদি 30/90 দিন (+) এর বেশি বা 30/90 (-) দিনের নীচে ফাইল / ফোল্ডার মুছতে চান তবে নীচের প্রাক্তন কমান্ডগুলি ব্যবহার করতে পারেন

উদাহরণস্বরূপ: 90 দিনের জন্য 90 দিনের ফাইল / ফোল্ডার মুছে ফেলার পরে উপরের কথা বাদ দেওয়া হয়, এর অর্থ 91,92 .... 100 দিন

find <path> -type f -mtime +90 -exec rm -rf {} \;

উদাহরণস্বরূপ: কেবলমাত্র সর্বশেষ 30 দিনের ফাইলের জন্য আপনি মুছতে চান তারপরে নীচের কমান্ডটি ব্যবহার করুন (-)

find <path> -type f -mtime -30 -exec rm -rf {} \;

আপনি যদি 2 দিনের বেশি ফাইলের জন্য ফাইলগুলি গিজ করতে চান তবে

find <path> -type f -mtime +2 -exec gzip {} \;

যদি আপনি কেবল গত এক মাস থেকে ফাইল / ফোল্ডারগুলি দেখতে চান। উদা:

find <path> -type f -mtime -30 -exec ls -lrt {} \;

30 দিনের উপরের কেবল তখনই ফাইল / ফোল্ডারগুলির তালিকা করুন প্রাক্তন:

find <path> -type f -mtime +30 -exec ls -lrt {} \;

find /opt/app/logs -type f -mtime +30 -exec ls -lrt {} \;

2

আমি অবাক হই ulimitএখানে কোন উত্তর নেই। যতবারই আমার এই সমস্যাটি হয় আমি এখানে বা এখানেই শেষ করি । আমি বুঝতে পারি এই সমাধানটির সীমাবদ্ধতা রয়েছে তবে ulimit -s 65536আমার কাছে প্রায়শই কৌশলটি করা মনে হয়।


1

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

find . -name "*.png" -mtime +50 -exec rm {} \;

অন্যান্য কমান্ডের সাথে পার্থক্য হ'ল মাইটটাইম প্যারামিটার যা কেবলমাত্র X দিনের চেয়ে পুরানো ফাইলগুলি নেবে (উদাহরণস্বরূপ 50 দিন)

একাধিকবার ব্যবহার করে, প্রতিটি নির্বাহের দিনে পরিসীমা হ্রাস করে, আমি সমস্ত অপ্রয়োজনীয় ফাইলগুলি সরাতে সক্ষম হয়েছি


1

আমি কেবল এই কাছাকাছি একটি উপায় জানি। ধারণাটি হ'ল পিডিএফ ফাইলগুলির সেই তালিকাটি কোনও ফাইলে রফতানি করা। তারপরে ফাইলটি বিভিন্ন অংশে বিভক্ত করুন। তারপরে প্রতিটি অংশে তালিকাভুক্ত পিডিএফ ফাইলগুলি সরান।

ls | grep .pdf > list.txt
wc -l list.txt

ডাব্লুসি-এলটি তালিকা.টিএসটিএসটিতে কত লাইনের অন্তর্ভুক্ত তা গণনা করতে হবে। আপনি কতক্ষণ এটি ধারণা রাখবেন, আপনি অর্ধেক, সামনে বা কিছুতে এটি ভাগ করার সিদ্ধান্ত নিতে পারেন। Split -l কমান্ড ব্যবহার করে উদাহরণস্বরূপ, এটি প্রতিটি 600 লাইনে বিভক্ত করুন।

split -l 600 list.txt

এটি xaa, xab, xac নামে কয়েকটি ফাইল তৈরি করবে এবং কীভাবে আপনি এটি ভাগ করবেন তার উপর নির্ভর করে। এখন এই ফাইলটির প্রতিটি তালিকা "আমদানি" করতে rm কমান্ড-এ ব্যবহার করুন:

rm $(<xaa)
rm $(<xab)
rm $(<xac)

আমার অদক্ষ ইংরেজির জন্য আমি দুঃখিত.


5
আপনার নামের pdf_format_sucks.docxএই ফাইলটিও মুছে ফেলা হবে ... ;-) পিডিএফ ফাইলগুলির জন্য গ্রেপিং করার সময় আপনার যথাযথ এবং সঠিক নিয়মিত অভিব্যক্তি ব্যবহার করা উচিত।
FooF

1
আরও ভাল তবে still_pdf_format_sucks.docxমুছে ফেলা হবে। ডট .মধ্যে ".pdf"রেগুলার এক্সপ্রেশন কোনো চরিত্র মেলে। আমি "[.]pdf$"পরিবর্তে পরামর্শ দিতে হবে .pdf
FooF

1

আমি কয়েকবার এই সমস্যায় পড়েছি। সমাধানগুলির মধ্যে অনেকগুলি rmপৃথক ফাইলের জন্য কমান্ড চালাবে যা মুছতে হবে। এটি খুব অদক্ষ:

find . -name "*.pdf" -print0 | xargs -0 rm -rf

আমি ফাইল-নেমে প্রথম 4 টি অক্ষরের উপর ভিত্তি করে ফাইলগুলি মুছতে অজগর স্ক্রিপ্ট লিখে শেষ করেছি:

import os
filedir = '/tmp/' #The directory you wish to run rm on 
filelist = (os.listdir(filedir)) #gets listing of all files in the specified dir
newlist = [] #Makes a blank list named newlist
for i in filelist: 
    if str((i)[:4]) not in newlist: #This makes sure that the elements are unique for newlist
        newlist.append((i)[:4]) #This takes only the first 4 charcters of the folder/filename and appends it to newlist
for i in newlist:
    if 'tmp' in i:  #If statment to look for tmp in the filename/dirname
        print ('Running command rm -rf '+str(filedir)+str(i)+'* : File Count: '+str(len(os.listdir(filedir)))) #Prints the command to be run and a total file count
        os.system('rm -rf '+str(filedir)+str(i)+'*') #Actual shell command
print ('DONE')

এটি আমার পক্ষে খুব ভাল কাজ করেছে। আমি প্রায় 15 মিনিটের মধ্যে একটি ফোল্ডারে 2 মিলিয়ন টেম্পের ফাইলগুলি সাফ করতে সক্ষম হয়েছি। আমি কোডটি অল্প অল্প করেই ট্যারে মন্তব্য করেছি যাতে অল্প অজগর জ্ঞানের কেউ যদি এই কোডটি চালিত করতে পারে।


1

এবং অন্য একটি:

cd  /path/to/pdf
printf "%s\0" *.[Pp][Dd][Ff] | xargs -0 rm

printfএটি একটি শেল অন্তর্নির্মিত এবং যতদূর আমি জানি এটি সবসময় যেমন ছিল। এখন প্রদত্ত যে printfশেল কমান্ড নয় (তবে একটি বিল্টিন), এটি সাপেক্ষে নয় "argument list too long ... মারাত্মক ত্রুটির ।

সুতরাং আমরা এটি নিরাপদে শেল গ্লোববিং নিদর্শনগুলির সাথে ব্যবহার করতে পারি *.[Pp][Dd][Ff], তারপরে আমরা ( rm) কমান্ডটি সরাতে তার আউটপুটটি পাইপ করি xargsযা নিশ্চিত করে যে এটি কমান্ড লাইনে পর্যাপ্ত ফাইলের নাম ফিট করে যাতে rmকমান্ডটি ব্যর্থ না হয় যা শেল is কমান্ড।

\0মধ্যে printfফাইলের নাম কোনটা তারপর প্রসেস করা হয় একটি নাল বিভাজক হিসেবে কাজ করে xargsকমান্ড এটি ব্যবহার ( -0) একটি বিভাজক হিসেবে, তাই rmখেলাফ করেন না যখন সাদা স্পেস বা ফাইলের নাম অন্য বিশেষ অক্ষর।


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

বিশেষত, যদি printfশেল বিল্টিন না হয় তবে এটি একই সীমাবদ্ধতার বিষয় হতে পারে।
টবি স্পাইট

0

আপনি একটি অস্থায়ী ফোল্ডার তৈরি করতে পারেন, টেম্প ফোল্ডারে রাখতে চান এমন সমস্ত ফাইল এবং সাব-ফোল্ডার সরিয়ে ফেলতে পারেন তবে পুরানো ফোল্ডারটি মুছুন এবং টেম্প ফোল্ডারটির নাম পুরানো ফোল্ডারে নামকরণ করুন যতক্ষণ না আপনি এটির প্রত্যক্ষভাবে আত্মবিশ্বাসী হন:

mkdir testit
cd testit
mkdir big_folder tmp_folder
touch big_folder/file1.pdf
touch big_folder/file2.pdf
mv big_folder/file1,pdf tmp_folder/
rm -r big_folder
mv tmp_folder big_folder

rm -r big_folderসব ফাইল মুছে ফেলা হবে big_folderকোন ব্যাপার না যতই। আপনাকে প্রথমে খুব সাবধান থাকতে হবে আপনার প্রথমে আপনার যে সমস্ত ফাইল / ফোল্ডার রাখতে চান তা রাখতে হবে, এক্ষেত্রে এটি ছিলfile1.pdf


0

*.pdfএকটি ডিরেক্টরিতে সমস্ত মুছতে/path/to/dir_with_pdf_files/

mkdir empty_dir        # Create temp empty dir

rsync -avh --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

rsyncআপনার কয়েক মিলিয়ন ফাইলের ক্ষেত্রে ওয়াইল্ডকার্ড ব্যবহার করে নির্দিষ্ট ফাইলগুলি মুছে ফেলা সম্ভবত দ্রুততম সমাধান। এবং এটি যে ত্রুটি পাচ্ছে তার যত্ন নেবে।


(Stepচ্ছিক পদক্ষেপ): চালা চালান। মোছা না করে কী মুছে ফেলা হবে তা পরীক্ষা করতে। `

rsync -avhn --delete --include '*.pdf' empty_dir/ /path/to/dir_with_pdf_files/

। । ।

আরও rsync হ্যাকের জন্য rsync টিপস এবং কৌশলগুলি ক্লিক করুন


0

আমি দেখতে পেয়েছি যে ফাইলগুলির বৃহত তালিকার জন্য (> 1e6), এই উত্তরগুলি খুব ধীর ছিল slow পাইথনে সমান্তরাল প্রক্রিয়াকরণ ব্যবহার করে একটি সমাধান এখানে দেওয়া হল। আমি জানি, আমি জানি, এটি লিনাক্স নয় ... তবে এখানে আর কিছুই কাজ করেনি।

(এটি আমার ঘন্টা বাঁচিয়েছে)

# delete files
import os as os
import glob
import multiprocessing as mp

directory = r'your/directory'
os.chdir(directory)


files_names = [i for i in glob.glob('*.{}'.format('pdf'))]

# report errors from pool

def callback_error(result):
    print('error', result)

# delete file using system command
def delete_files(file_name):
     os.system('rm -rf ' + file_name)

pool = mp.Pool(12)  
# or use pool = mp.Pool(mp.cpu_count())


if __name__ == '__main__':
    for file_name in files_names:
        print(file_name)
        pool.apply_async(delete_files,[file_name], error_callback=callback_error)

0

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি যখন একটি অ্যাপ্লিকেশন দ্বারা তৈরি করা কয়েক মিলিয়ন অকেজো লগ ফাইল ছিল যা সমস্ত ইনোড পূরণ করে। আমি "অবস্থিত" অবলম্বন করেছি, সমস্ত ফাইল "অবস্থিত" ডিটিকে একটি পাঠ্য ফাইলে পেয়েছি এবং তারপরে সেগুলি একে একে মুছে ফেলেছি। কিছুটা সময় নিল কিন্তু কাজটি করলো!


এটি বেশ অস্পষ্ট এবং আপনার locateযখনই আপনার ডিস্কে জায়গা ছিল তখন আপনাকে আবার ইনস্টল করা প্রয়োজন ।
ট্রিপলি

-2

এক্সার্গস ব্যবহারের চেয়ে কিছুটা নিরাপদ সংস্করণ, যা পুনরাবৃত্ত হয় না: ls -p | grep -v '/$' | grep '\.pdf$' | while read file; do rm "$file"; done

আমাদের ডিরেক্টরিগুলি এখানে ফিল্টার করা কিছুটা অপ্রয়োজনীয় কারণ 'আরএম' এটিকে যাইহোক মুছে ফেলবে না, এবং এটি সরলতার জন্য মুছে ফেলা যাবে, তবে কেন এমন কিছু চালান যা অবশ্যই ত্রুটি ফিরে পাবে?


3
এটি মোটেই নিরাপদ নয়, এবং কোনও স্পষ্টত কোণার কেস দেখানোর জন্য ফাইলগুলিতে নতুন লাইনের সাথে নামগুলির সাথে কাজ করে না। পার্সিংls একটি সাধারণ অ্যান্টিপ্যাটার্ন যা অবশ্যই এড়ানো উচিত এবং এখানে বেশ কয়েকটি অতিরিক্ত বাগ যোগ করা হয়েছে। grep | grepশুধু খুব মার্জিত নয়।
ট্রিপলি

যাইহোক, এটি একটি নতুন এবং বহিরাগত সমস্যা এটির মতো নয় যার জটিল সমাধান প্রয়োজন। উত্তরগুলি findভাল এবং এখানে এবং অন্য কোথাও ডকুমেন্টেড। এই এবং অন্যান্য সম্পর্কিত বিষয়ে আরও জানতে উদাহরণস্বরূপ mywiki.wooledge.org দেখুন ledge
ট্রিপলি

-2

GNU সমান্তরাল ব্যবহার করে (sudo apt install parallel ) করা অত্যন্ত সহজ

এটি মাল্টিথ্রেড কমান্ডগুলি চালিত করে যেখানে '{}' আর্গুমেন্টটি পাস করেছে

যেমন

ls /tmp/myfiles* | parallel 'rm {}'


আমি জানি না, তবে আমি এটি অনুমান করি কারণ lsঅন্যান্য কমান্ডের সাথে সরাসরি আউটপুট সরবরাহ করা একটি বিপজ্জনক প্রতিষেধক - এটি এবং যে ওয়াইল্ডকার্ডের প্রসারণটি lsমূল rmকমান্ডে অভিজ্ঞ হিসাবে কার্যকর করার সময় একই ব্যর্থতার কারণ হয়ে দাঁড়াবে ।
টবি স্পাইট

সে প্রসঙ্গে, পার্সিংএলগুলি দেখুন । এবং parallelকিছু ভাবেন যা জটিলতা এড়ানো অস্বস্তি করে তোলে - আপনি যদি হুডের নীচে তাকান তবে এটি বেশ অস্বচ্ছ। স্টিফেনের ( ইউনিক্স এবং লিনাক্স স্ট্যাকএক্সচেঞ্জ গ্রেইবার্ডগুলির মধ্যে একটি ) এবং ওলে টেঞ্জের (সমান্তরালের লেখক) এর মধ্যে মেইলিং তালিকা থ্রেডটি সূচিত্রে দেখুন. gnu.org/archive/html/bug-parallel/2015-05/msg00005.html এ । xargs -Pএছাড়াও প্যারালাইলাইজ করে, তবে এটি কম সরানো অংশগুলির সাথে একটি সহজ, ঘন পথে উপস্থাপন করে, এর আচরণটি ভবিষ্যদ্বাণী করা এবং কারণ সম্পর্কে আরও সহজ করে তোলে।
চার্লস ডাফি

-2

প্রথম 100 টি ফাইল সরানোর জন্য:

rm -rf 'ls | মাথা -100 '


2
বিপজ্জনক (বা এটি যদি আপনি স্পষ্টভাবে উদ্দেশ্য হিসাবে ব্যাককোটগুলি ব্যবহার করেন) - যদি কোনও ফাইলনামে ফাঁকা স্থান সহ শেল মেটাচার্যাক্টর থাকে, তবে ফলাফলগুলি আপনি যা চান তা সেগুলি হবে না।
টবি স্পাইট

-5

নীচের বিকল্পটি এই সমস্যাটিকে সহজ বলে মনে হচ্ছে। আমি এই তথ্যটি অন্য কোনও থ্রেড থেকে পেয়েছি তবে এটি আমাকে সহায়তা করেছিল।

for file in /usr/op/data/Software/temp/application/openpages-storage/*; do
    cp "$file" /opt/sw/op-storage/
done

উপরের একটি কমান্ডটি চালান এবং এটি কাজটি করবে।

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