কমান্ড লাইন: পাইপিং rm এর ফলাফল সন্ধান করে


140

আমি একটি কমান্ড নিয়ে কাজ করার চেষ্টা করছি যা 15 দিনের বেশি পুরানো স্কিল ফাইল মুছে ফেলবে।

সন্ধান অংশটি কাজ করছে তবে আরএম নয়।

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f  \( -name '*.sql' \) -mtime +15

এটি মুছে ফেলার মতো ফাইলগুলির একটি তালিকা বের করে তবে সেগুলি মুছে ফেলছে না। পথগুলি সঠিক।

usage: rm [-f | -i] [-dIPRrvW] file ...
       unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql

আমি কি ভুল করছি?

উত্তর:


274

আপনি আসলে বংশীধ্বনিতুল্য হয় rmএর আউটপুট ইনপুট find। আপনি যা চান তা আউটপুটটিকে আর্গুমেন্টfind হিসাবে ব্যবহার করা :rm

find -type f -name '*.sql' -mtime +15 | xargs rm

xargsহ'ল কমান্ডটি যা এর স্ট্যান্ডার্ড ইনপুটটিকে অন্য প্রোগ্রামের আর্গুমেন্টগুলিতে "রূপান্তর" করে, বা যেমন তারা আরও সঠিকভাবে এটি manপৃষ্ঠাতে রাখে,

স্ট্যান্ডার্ড ইনপুট থেকে কমান্ড লাইনগুলি তৈরি এবং সম্পাদন করে

দ্রষ্টব্য যে যদি ফাইলের নামগুলিতে সাদা স্থানের অক্ষর থাকতে পারে তবে আপনার জন্য এটি সংশোধন করা উচিত:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm

তবে আসলে এর findজন্য একটি শর্টকাট রয়েছে: -deleteবিকল্প:

find -type f -name '*.sql' -mtime +15 -delete

নিম্নলিখিত সতর্কতা সম্পর্কে দয়া করে সচেতন হন man find:

  Warnings:  Don't  forget that the find command line is evaluated
  as an expression, so putting -delete first will make find try to
  delete everything below the starting points you specified.  When
  testing a find command line that you later intend  to  use  with
  -delete,  you should explicitly specify -depth in order to avoid
  later surprises.  Because -delete  implies  -depth,  you  cannot
  usefully use -prune and -delete together.

পিএস নোট করুন যে সরাসরি পাইপ দেওয়া rmকোনও বিকল্প নয়, কারণ rmস্ট্যান্ডার্ড ইনপুটটিতে ফাইলের নাম আশা করা যায় না। আপনি বর্তমানে যা করছেন তা তাদের পিছন দিকে পাইপ করা।


1
ধন্যবাদ। আমি ম্যান পৃষ্ঠাটি পড়েছি এবং সেই পতাকাটি চেষ্টা করেছিলাম। আমি একটি সম্পূর্ণ পথ অতিক্রম করছি তবে ফিরে আসছি "/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /: আপেক্ষিক পথটি সম্ভবত নিরাপদ নয়"। কোন ধারণা কেন?
jerrygarciuh

1
@ জেরিগারসিউহ এখানে দেখুন ।
লেভ লেভিটস্কি

ধন্যবাদ। আমি নিশ্চিত নই যে আমি পোস্টটি ভালভাবে অনুসরণ করেছি তবে কমান্ডের শেষে যখন আমি তাদের সমাধানটি অনুকরণ করেছি এবং মোড সময়কে নির্বিশেষে এটি সমস্ত স্কিল ফাইলগুলি মুছে ফেলে ... তবে এতে সতর্কতা ছিল না তাই আমার ধারণা এটি অগ্রগতি ...
jerrygarciuh

1
@ জেরিগারসিউহ ওউচ, আমি আশা করি মূল্যবান কোনও কিছুই হারাবে না ... manবলেছেন: When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid later surprises.আমি নিশ্চিত নই যে আপনি যে অন্যান্য বিকল্পগুলি ব্যবহার করেছেন, তা কীভাবে কার্যকর হবে তবে আপনি কি তা চেষ্টা করেছিলেন?
লেভ লেভিটস্কি

নাহ আমি কিছুই করি নি তবে কিছুই হারিয়ে যায়নি। এই ফাইলগুলি অন্য সার্ভার থেকে আরএসসিএন-এড হয় যেখানে সেগুলি সঞ্চিত থাকে।
jerrygarciuh

26
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

/usr/www/bar/htdocs15 দিনের চেয়ে পুরানো ফাইলগুলি নির্বাচন করবে এবং সেগুলি সরিয়ে দেবে।


"নামে স্থান" থাকার কারণে আমি আপনার উত্তরটির চেয়ে বেশি পছন্দ করেছি। এটি পাইপের চেয়ে "-এক্সেক" কমান্ড দিয়ে আরও ভালভাবে পরিচালনা করা হয়েছে। ধন্যবাদ।
স্লিম আলৌই

3

আর একটি সহজ পদ্ধতি হ'ল locateকমান্ড ব্যবহার করা । তারপরে, ফলাফলটি পাইপ করুনxargs

উদাহরণ স্বরূপ,

locate file | xargs rm

2

ধরে নিই যে আপনি * .sql ব্যাকআপ ফাইল ধারণকারী ডিরেক্টরিতে নেই:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;

উপরের -v বিকল্পটি হ'ল এটি কার্যকরভাবে আউটপুট দেবে কোন ফাইলগুলি মুছে ফেলা হচ্ছে সেগুলি মুছে ফেলা হচ্ছে।

আমি নিশ্চিত হতে প্রথমে মুছে ফেলা হবে এমন ফাইলগুলির তালিকা করতে চাই। উদাহরণ:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.