ফাইল নেমে “2015” দিয়ে এক দিনের চেয়ে পুরানো ফাইলগুলি কীভাবে তালিকাভুক্ত করবেন?


11

আমি আজকের অন্তর্ভুক্ত নয় এমন সমস্ত লগ ফাইল এবং কেবল 2015তাদের নামের মধ্যে থাকা ফাইলগুলির তালিকা করতে চাই ।

এই হুকুম আমি চেষ্টা করেছি:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

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


findঅংশ আমার কাছে ভালই লাগছে, কিন্তু আমি সঙ্গে সমস্যা ছিল -execপ্যারামিটার। আমি এটি কাজ করতে পারি না। (আমি সমস্ত জেপিজি ফাইলগুলি এর মাধ্যমে একটি ফোল্ডার থেকে তার মূল ডিরেক্টরিতে স্থানান্তরিত করার চেষ্টা করছিলাম - এবং নিজেই এটি শেষ করে দিয়েছি ...)
বাইট কমান্ডার


@steeldriver আমি মনে করি যে সত্যিই ভুল এখানে কী হচ্ছে, যেহেতু সেখানে সঙ্গে ছিল বর্তমান ডিরেক্টরির সকল ফাইলের 2015তাদের নামটি দিয়ে (উপায় অন্যান্য সুস্পষ্ট ঘাট কমান্ড লেখা আছে) আমি সন্দেহ সেখানে হবে কিছু আউটপুট ধরনের। সুতরাং আপনি যে সম্পর্কে একটি উত্তর পোস্ট করতে পারেন।
এলিয়াহ কাগন

উত্তর:


18

কমান্ড find . -name '*2015*' -mmin +1440 -lsসম্ভবত আপনি যা করতে চান তা করবে। বিস্তারিত জানার জন্য নীচে দেখুন।

আপনার প্রথম আদেশ ছিল -name 2015। এটি কাজ করে না কারণ এটি কেবল এমন ফাইলগুলি খুঁজে পায় যার নামগুলি হুবহু 2015 এবং এর মধ্যে অন্য কোনও অক্ষর নেই।

আপনার দ্বিতীয় কমান্ড, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;বেশ কয়েকটি কারণে ব্যর্থ হতে পারে:

1. অব্যর্থ *অক্ষরগুলি শেল দ্বারা প্রসারিত হয়, তারপরে প্রেরণ করা হয় find

বর্তমান ডিরেক্টরিতে যদি সরাসরি কোনও ফাইল find ...থাকে 2015( আপনি সেই কমান্ডটি চালানোর সময় আপনি ছিলেন এমন ) যার নামগুলি রয়েছে (এবং এটি দিয়ে শুরু করবেন না .), তবে শেলটি*2015* সেই ফাইলের নামের তালিকায় প্রসারিত হবে, তারপরে পাস হবে যুক্তি হিসাবে তালিকা find। এটি আপনি যা চান তা নয় - পরিবর্তে, আপনি *2015*অনুসন্ধানের জন্য একটি আর্গুমেন্ট হিসাবে আক্ষরিকভাবে পাস করতে চান , যাতে findশেলটি নয় এবং এটি খুঁজে পেতে পারে যে কোনও ফাইল এর সাথে মেলে।

সমস্যাটি সমাধান করার জন্য, উদ্ধৃতি *2015*। এটি করার জন্য তিনটি সাধারণ উপায় রয়েছে:

  • '*2015*'(যেমন, find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;)
  • "*2015*"(যেমন, find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;)
  • \*2015\*(যেমন, find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;)

আমি এটি হিসাবে একক উদ্ধৃতি দিয়ে এটি লেখার পরামর্শ দিচ্ছি , কারণ:'*2015*'

তবে এক্ষেত্রে এটা আসলে কিছু যায় আসে না। 'এবং "উভয়ই *একইরকম আচরণ করে এবং \বোঝা শক্ত করে তুলতে উদ্ধৃতিটির জন্য ভাবটি যথেষ্ট জটিল নয় isn't

2. -mtime +1শুধুমাত্র নির্বাচন ফাইল মডিফাই দুই বা ততোধিক দিন আগে।

যেমনটি man findবলেছেন:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

মনে করুন একটি ফাইল 47 ঘন্টা আগে সংশোধিত হয়েছিল। কত 24-ঘন্টা সময়সীমার যে, জিনিসটা findচক্রের নিচে : এটা এক 24 ঘন্টা সময়সীমার আগে। তবে -mtime +1কেবলমাত্র সেই ফাইলগুলির সাথে মেলে যাঁর পরিবর্তনের সময়গুলি 24 ঘন্টা আগে খুব বেশি কঠোর হয় । গতকাল থেকে ফাইলগুলি মেলে না।

দেখুন কেন -মটাইম +1 কেবল 2 দিনের চেয়ে পুরানো ফাইলগুলি ফেরত দেয়? আরও তথ্যের জন্য, স্টেল্ড্রাইভার দ্বারা প্রস্তাবিত

ফাইল খুঁজতে সর্বশেষ সংশোধিত যে কোন সময় চেয়ে বেশি 24 ঘন্টা আগে , আমি পরিবর্তে যেমন stipulating করার পরামর্শ দিই 1440 মিনিট আগে সঙ্গে -mmin +1440:

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

কিছু পাঠক হয়তো ভাবছেন কেন আমি উদ্ধৃতি দিলাম না {}। কিছু লোক মানবকে {}স্মরণ করিয়ে দেওয়ার জন্য উদ্ধৃতি দিয়ে থাকে যে এটি বন্ধনী সম্প্রসারণের অভিব্যক্তি নয় । বোর্ন ধাঁচের শাঁস (যেমন ব্যাশ ) না প্রয়োজন, {}কিছুই ভিতরে উদ্ধৃত করা হয়। হতে পারে কিছু বোর্ন-স্টাইলের শেল এটি বিশেষভাবে ব্যবহার করে; এই কারণেই কিছু ব্যবহারকারীরা এটি উদ্ধৃত করেছেন। তবে একটি ভুল ধারণাও রয়েছে যে এক সময় অবশ্যই উদ্ধৃতি করা উচিত {}তাই -execস্পেস সহ ফাইলের নামগুলি সঠিকভাবে পরিচালনা করে। যে; র মিথ্যা: সঙ্গে {}বা '{}', findপায় একই আর্গুমেন্ট, যেমন শেল কোট সরিয়ে ফেলা হবে ক্ষণস্থায়ী আগে '{}'থেকেfind। এই ভুল ধারণাটি মোকাবেলার জন্য, আমি উদ্ধৃতি দিচ্ছি না {}, তবে এটি শৈলীর বিষয় - যদি আপনি {}শেল কীভাবে চিকিত্সা করছেন না {এবং }বিশেষভাবে এটি নথিভুক্ত করতে পছন্দ করেন তবে তা ঠিক।

আমি আপনাকে প্রস্তাব দিয়েছি হয় হয় আপনার lsআদেশটি পরিবর্তন করুন , বা (যেমন মুড়ু পরামর্শ দিয়েছেন ) findএর -lsপদক্ষেপের সাথে এটি প্রতিস্থাপন করুন । ls -ltrhসম্ভবত আপনি যা করতে চান তা করছেন না কারণ এটি পাওয়া প্রতিটি ফাইলের জন্য এটি পৃথকভাবে চালিত হয় এবং সুতরাং -tএবং -rপতাকাগুলি, যা বাছাইকরণ নির্দিষ্ট করে, অপ্রাসঙ্গিক।

যদিও আউটপুটটি এর চেয়ে কিছুটা আলাদাভাবে ফর্ম্যাট করা হবে তবে ls -lব্যবহার -lsকরা সহজ এবং সহজ।

find . -name '*2015*' -mmin +1440 -ls

বা যদি আপনি স্থির করেন তবে আপনাকে কেবলমাত্র ফাইলটির নাম তালিকাভুক্ত করতে হবে (যার সাথে সম্পর্কিত তাদের পাথ সহ .), আপনি কেবল কোনও পদক্ষেপ নির্দিষ্ট করতে পারবেন না, যার ফলে ডিফল্ট -printক্রিয়াটি ব্যবহৃত হবে:

find . -name '*2015*' -mmin +1440

1
ভাল উত্তর! কমপক্ষে জিএনইউ অনুসন্ধানের সাথে, newerXYবাক্য -newermt 'yesterday'! -newermt 'yesterday'
গঠনও রয়েছে

তুমি কি জান ? আপনি দুর্দান্ত @ @ এলিয়াহ
কাগন

ধন্যবাদ স্টেল ড্রাইভার, জানতে লিঙ্কটি থেকে খুব ভাল তথ্য জানায়। তবে আমার ক্ষেত্রে এটি অ্যাপ্লিকেশন লগ হিসাবে অ্যাপ্লিকেশন লগগুলি পুরানো ফাইলগুলি পরিবর্তিত হওয়ার কোনও উপায় পায় নি। আপনাকে আবারও ধন্যবাদ
rɑːdʒɑ

2

অভিব্যক্তিটি উদ্ধৃত করুন এবং আমি আপনাকেও বন্ধনী হিসাবে উদ্ধৃত করার পরামর্শ দিচ্ছি

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

অথবা

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

আপনার কাছে যে ফাইলগুলি পাওয়া যায় সেগুলি পাস করার দরকার নেই

find . -name "*2015*" -mtime +1

সম্ভবত ব্যবহার নিষিদ্ধ -type f? এবং যদি lsব্যবহার করতে হয় তবে ব্যবহারের পরামর্শ দিন -ls
মুড়ু

1
অবশ্যই, সমস্ত ভাল পরামর্শ। আমি নিশ্চিত নই যে ওপি কী চায় এবং আমি বিশ্বাস করি সমস্যার উত্স হ'ল "-name" অনুসন্ধান প্যাটার্নের আশেপাশের উদ্ধৃতিগুলির অভাব।
প্যান্থার

2

ইন zsh , আপনি ব্যবহার করতে পারেন উল্লিখিত glob কোয়ালিফায়ার (এই একটি অনন্য zsh বৈশিষ্ট্য, এই ধরনের ব্যাশ হিসাবে অন্যান্য শাঁস পাওয়া যায় না)।

ls -ltr *2015*(m+1)

এটি কেবলমাত্র বর্তমান ডিরেক্টরিতে ফাইল তালিকাভুক্ত করে; থেকে ঢুকা ডিরেক্টরি যাও recursively , ব্যবহার

ls -ltr **/*2015*(m+1)

এর সাথে find, -name 2015কেবল এমন ফাইলগুলি খুঁজে পায় যার নাম হুবহু 2015-name *2015*কেবলমাত্র কাজ করে যদি 2015বর্তমান ডিরেক্টরিটিতে এমন কোনও ফাইল নেই যার নাম অন্তর্ভুক্ত থাকে , কারণ শেলটি চালিত *2015*হওয়ার আগে প্যাটার্নটি প্রসারিত করে find। আপনাকে প্যাটার্নটি উদ্ধৃত করতে হবে:

find -name '*2015*' -mtime +1 …

নোট উভয় find -mtime +1এবং zsh এর *(m+1)ফাইল খুঁজে কমপক্ষে 48 ঘন্টা পুরাতন , আজ চেয়ে পুরোনো না ফাইল। প্লাস চিহ্নের অর্থ "কঠোরতর চেয়ে বেশি" এবং দিনের সংখ্যাটি গোল করা হয়। কমপক্ষে 24 ঘন্টা পুরানো ফাইলগুলি খুঁজতে, ব্যবহার করুন -mtime +0বা (m+0)

আপনি ফাইল সর্বশেষ পরিবর্তনের ছিল খুঁজে পেতে চান গতকাল বা তার পূর্বের , আপনি ব্যবহার করতে পারেন findসঙ্গে -newermtসম্পৃক্ত :

find -name '*2015*' ! -newermt 'today 0:00' …

Zsh এ এই পরীক্ষাটি করার কোনও সুবিধাজনক উপায় নেই।

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