কীভাবে পুনরাবৃত্তভাবে একটি ডিরেক্টরিতে সর্বশেষ পরিবর্তিত ফাইল সন্ধান করবেন?


242

মনে হচ্ছে lsপুনরাবৃত্তি কল করার সময় ফাইলগুলি সঠিকভাবে বাছাই করে না:

ls -altR . | head -n 3

আমি কীভাবে একটি ডিরেক্টরিতে (সাব-ডিরেক্টরি সহ) সর্বাধিক সংশোধিত ফাইলটি সন্ধান করতে পারি?


উত্তর:


357
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "

বিশাল গাছের জন্য, sortসমস্ত কিছু স্মৃতিতে রাখা শক্ত হয়ে উঠতে পারে ।

%T@আপনাকে ইউনিক্স টাইমস্ট্যাম্পের মতো পরিবর্তনের সময় দেয়, sort -nসংখ্যা অনুসারে বাছাই করে, tail -1শেষ লাইনটি (সর্বোচ্চ টাইমস্ট্যাম্প) cut -f2 -d" "নেয়, আউটপুট থেকে প্রথম ক্ষেত্রটি (টাইমস্ট্যাম্প) কেটে দেয়।

সম্পাদনা: কেবল -printfজিএনইউ-তে যেমন রয়েছে, তেমনই আজ্রিয়ালের ব্যবহারও stat -cখুব বেশি। যদিও বিএসডিতে এটি করা সম্ভব, বিন্যাসের বিকল্পগুলি ভিন্ন ( -f "%m %N"এটি মনে হবে)

আমি বহুবচনের অংশটি মিস করেছি; আপনি আরো তারপর চান তাহলে সর্বশেষ ফাইল, শুধু লেজ যুক্তি আচমকা।


7
অর্ডারটি যদি গুরুত্বপূর্ণ হয় তবে আপনি sort -rn | head -3পরিবর্তে ব্যবহারটি স্যুইচ করতে পারেন sort -n | tail -3। একটি সংস্করণ ফাইলগুলি পুরানো থেকে সর্বাধিক নতুনকে দেয়, অন্যটি সর্বশেষ থেকে প্রাচীনতম পর্যন্ত to
ডন ফকনার

3
আমার একটি বিশাল ডিরেক্টরি ছিল (প্রায় দশ হাজার ছোট ফাইল) এবং আমি পারফরম্যান্স সম্পর্কে চিন্তিত ছিলাম, কিন্তু ... এই কমান্ডটি এক সেকেন্ডেরও কম সময়ে চলে! দুর্দান্ত, অনেক ধন্যবাদ !!! :-)
লুকাফেরারিও

2
"একটি বিশাল গাছের জন্য, স্মৃতিতে সমস্ত কিছু রাখা ধরণের পক্ষে কঠিন।" প্রয়োজন অনুসারে sortঅস্থায়ী ফাইল (ইন /tmp) তৈরি করবে , তাই আমি এটিকে উদ্বেগ বলে মনে করি না।
ভ্লাদিমির পানতেলিভ

1
এটিকে সংশোধন করে: -printf '%T@ %Tb %Td %TY %p\n'আপনাকে একটি তারিখ স্ট্যাম্প দেবে (যদি প্রয়োজন হয়) (অনুরূপ ls)
bshea

1
আমি নিম্নলিখিতটি আরও সংক্ষিপ্ত এবং আরও ব্যাখ্যাযোগ্য আউটপুট সহ দেখতে find . -type f -printf '%TF %TT %p\n' | sort | tail -1
পেলাম

129

@ প্লুন্ড্রার উত্তর অনুসরণ করে , এখানে বিএসডি এবং ওএস এক্স সংস্করণ রয়েছে:

find . -type f -print0 | xargs -0 stat -f "%m %N" |
sort -rn | head -1 | cut -f2- -d" "

1
এর পরিবর্তে BSD / OS X findসমর্থন +করে \;? কারণ এটি -print0 | xargs -0পাইপ ছাড়াই একই জিনিসটি (একাধিক ফাইলকে প্যারামিটার হিসাবে পাস করা) করে ।
দেবসোলার

অবতরণ ক্রমে সংশোধিত ফাইলগুলির সর্বশেষ 5 বা এন নম্বর পেতে চাইলে কী করব?
খুনশান

পরিবর্তন @khunshan head -1করতেhead -5
এমারসন Farrugia

20

ফলাফলগুলি বাছাই করার পরিবর্তে এবং কেবলমাত্র সর্বশেষ পরিবর্তনকৃত পরিবর্তনগুলি রেখে, আপনি কেবলমাত্র সর্বোচ্চ পরিবর্তনের সময় (ইউনিক্স সময়ে) মুদ্রণ করতে বিশ্রী ব্যবহার করতে পারেন:

find . -type f -printf "%T@\0%p\0" | awk '
    {
        if ($0>max) {
            max=$0; 
            getline mostrecent
        } else 
            getline
    } 
    END{print mostrecent}' RS='\0'

ফাইলগুলির সংখ্যা যথেষ্ট পরিমাণে বড় হলে আপনার সমস্যা সমাধানের এটি দ্রুততর হওয়া উচিত।

আমি নুল অক্ষর ব্যবহার করেছি (অর্থাত '\ 0') কারণ, তাত্ত্বিকভাবে কোনও ফাইলের নামের মধ্যে কোনও অক্ষর থাকতে পারে (স্থান এবং নিউলাইন সহ) তবে তা।

আপনার সিস্টেমে এ জাতীয় প্যাথলজিকাল ফাইল নাম না থাকলে আপনি নিউলাইন চরিত্রটিও ব্যবহার করতে পারেন:

find . -type f -printf "%T@\n%p\n" | awk '
    {
        if ($0>max) {
            max=$0; 
            getline mostrecent
        } else 
            getline
    } 
    END{print mostrecent}' RS='\n'

তদ্ব্যতীত, এটি মওকটিতেও কাজ করে।


এটি অতি সাম্প্রতিক তিনটি রাখতে সহজেই মানিয়ে নেওয়া যেতে পারে।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
এটি mawkডেবিয়ান স্ট্যান্ডার্ড বিকল্পের সাথে কাজ করে না ।
জানুয়ারী

না, তবে সেক্ষেত্রে আপনি নতুন লাইনের চরিত্রটি ব্যবহার করতে পারেন যদি এটি আপনাকে বিরক্ত না করে;)
মার্কো

10

আমি কষ্ট সোলারিস 10 বছরের কম গত পরিবর্তিত ফাইল খুঁজতে ছিল findনেই printfবিকল্প এবং statপাওয়া যায় না। আমি নিম্নলিখিত সমাধানটি আবিষ্কার করেছি যা আমার পক্ষে ভাল কাজ করে:

find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1

ফাইলের নামটি দেখতেও ব্যবহার করুন

find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1

ব্যাখ্যা

  • find . -type f সমস্ত ফাইল সন্ধান করে এবং তালিকাবদ্ধ করে
  • sed 's/.*/"&"/' হোয়াইটস্পেসগুলি পরিচালনা করতে উদ্ধৃতিগুলিতে পথের নামটি মোড়ানো
  • xargs ls -Eউদ্ধৃত পথটিতে প্রেরণ করে ls, -Eবিকল্পটি নিশ্চিত করে যে একটি পূর্ণ টাইমস্ট্যাম্প ( বছর-মাস-দিন-ঘন্টা-মিনিট-সেকেন্ড-ন্যানোসেকেন্ডস বিন্যাস ) ফিরে এসেছে
  • awk '{ print $6," ",$7 }' কেবল তারিখ এবং সময় আহরণ করে
  • awk '{ print $6," ",$7," ",$9 }' তারিখ, সময় এবং ফাইলের নাম আহরণ করে
  • sort তারিখ অনুসারে বাছাই করা ফাইলগুলি ফেরত দেয়
  • tail -1 শুধুমাত্র শেষ পরিবর্তিত ফাইল ফেরত দেয়

9

সাব-ডাইরেক্টরি দিয়েও এটি দুর্দান্ত কাজ করছে বলে মনে হচ্ছে:

find . -type f | xargs ls -ltr | tail -n 1

খুব বেশি ফাইলের ক্ষেত্রে, অনুসন্ধানটি পরিমার্জন করুন।


1
-lবিকল্প lsঅপ্রয়োজনীয় বলে মনে হয়। শুধু -trযথেষ্ট বলে মনে হয়।
একিউম্যানাস

6
এটি ডিরেক্টরি অনুসারে
সাজিয়েছে

1
যদি ফাইল পাথগুলিতে আরও স্পেস থাকে তবে আরও করুন:find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
পর্যায়ক্রমিক রক্ষণাবেক্ষণ

এটি আমার জন্য সর্বশেষতম ফাইলগুলি খুঁজে পায় না।
কে.-মাইকেল আয়ে


7

মানব পাঠযোগ্য টাইমস্ট্যাম্প সহ সর্বশেষতম ফাইলটি দেখায়:

find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n1

ফলাফলটি এরকম দেখাচ্ছে:

2015-10-06 11:30: +0200 ./foo/bar.txt

আরও ফাইলগুলি দেখানোর জন্য -n1, একটি উচ্চতর সংখ্যার সাথে প্রতিস্থাপন করুন


5

আমি সর্বদা অনুরূপ কিছু ব্যবহার করি, পাশাপাশি সর্বাধিক সংশোধিত ফাইলগুলির শীর্ষ-কে তালিকা। বড় ডিরেক্টরি গাছের জন্য, বাছাই এড়াতে এটি আরও দ্রুত হতে পারে । সর্বাধিক সংশোধিত ফাইলের মধ্যে শীর্ষস্থানীয় -১ এর ক্ষেত্রে:

find . -type f -printf '%T@ %p\n' | perl -ne '@a=split(/\s+/, $_, 2); ($t,$f)=@a if $a[0]>$t; print $f if eof()'

১.7 মিলিয়ন ফাইল সম্বলিত ডিরেক্টরিতে, আমি সর্বাধিক সাম্প্রতিক একটিটি 3.4 এস মধ্যে পেয়েছি, বাছাইয়ের সাহায্যে 25.5 এর সমাধানের তুলনায় 7.5x গতি।


খুব শীতল: আমি সবেমাত্র শেষ মুদ্রণটির সাথে এক্সচেঞ্জ করেছি: সিস্টেম ("ls -l $ f") যদি eof () তারিখটি খুব সুন্দরভাবে দেখায় তবেও।
মার্টিন টি।

@MartinT। : দুর্দান্ত, আপনাকে স্বাগত জানাই। আমার কাছে আশ্চর্যের বিষয় যে যখন কোনও ও (এন) পদ্ধতি উপলব্ধ থাকে তখন লোকেদের জিনিসগুলি (O (n লগ এন)) বাছাই করার জন্য এই প্রবৃত্তি থাকে। এটি মনে হয় বাছাই এড়ানো একমাত্র উত্তর। বিটিডাব্লু, আমি যে কমান্ডটির প্রস্তাব দিয়েছিলাম তার লক্ষ্যটি কেবলমাত্র সর্বশেষতম ফাইলটির সন্ধান করা। আপনি নিজের শেলের কমান্ডটি উপনাম lastfileকরতে পারেন (যেমন :) এবং ফলাফলের সাথে আপনি যা পছন্দ করতে পারেন যেমন ls -l $(lastfile .), বা open $(lastfile .)(একটি ম্যাকে) ইত্যাদি
পিয়ের ডি

ওহ, আমি সংশোধন করে দাঁড়িয়েছি: আমি নীচে আরও একটি উত্তর দেখছি (@ মার্কো)। +1 টি।
পিয়েরে

4

এটি একটি বাছাই করা তালিকা দেয়:

find . -type f -ls 2>/dev/null | sort -M -k8,10 | head -n5

সাজানোর আদেশে '-r' রেখে অর্ডারটি বিপরীত করুন। আপনি যদি কেবল ফাইলের নাম চান তবে "awk '{মুদ্রণ $ 11}' |" sertোকান আগে '| মাথা '


3

উবুন্টু ১৩-তে, নিম্নলিখিতটি এটি করে, সম্ভবত একটি বাচ্চা দ্রুততর হয়, কারণ এটি বাছাইটি উল্টে দেয় এবং কাজটি হ্রাস করে 'লেজ' এর পরিবর্তে 'মাথা' ব্যবহার করে। একটি গাছে 11 টি নতুন ফাইল দেখানোর জন্য:

অনুসন্ধান . -প্রকারের এফ-প্রিন্টফ '% টি @% পি \ n' | সাজানো -n -r | মাথা -11 | কাট -f2- -d "" | সেড-এর, ^। /, '| xargs ls -U -l

এটি পুনরায় বাছাই ছাড়াই একটি সম্পূর্ণ ls তালিকা দেয় এবং বিরক্তিকর './' কে বাদ দেয় যা প্রতিটি ফাইলের নাম 'অনুসন্ধান' করে।

বা, বাশ ফাংশন হিসাবে:

treecent () {
  local numl
  if [[ 0 -eq $# ]] ; then
    numl=11   # Or whatever default you want.
  else
    numl=$1
  fi
  find . -type f -printf '%T@ %p\n' | sort -n -r | head -${numl} |  cut -f2- -d" " | sed -e 's,^\./,,' | xargs ls -U -l
}

তবুও, বেশিরভাগ কাজ প্লুন্ড্রার মূল সমাধান দ্বারা করা হয়েছিল। ধন্যবাদ প্লুন্ড্রা।


3

আমি একই সমস্যা সম্মুখীন। আমার সর্বাধিক সাম্প্রতিক ফাইল পুনরাবৃত্তভাবে সন্ধান করা দরকার। খুঁজে পেতে প্রায় 50 মিনিট সময় নেয়।

এটি দ্রুত করার জন্য এখানে একটি ছোট স্ক্রিপ্ট রয়েছে:

#!/bin/sh

CURRENT_DIR='.'

zob () {
    FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
    if [ ! -f ${FILE} ]; then
        CURRENT_DIR="${CURRENT_DIR}/${FILE}"
        zob
    fi
    echo $FILE
    exit
}
zob

এটি একটি পুনরাবৃত্ত ফাংশন যারা কোনও ডিরেক্টরিতে সর্বাধিক সংশোধিত আইটেমটি পায়। যদি এই আইটেমটি ডিরেক্টরি হয় তবে ফাংশনটিকে পুনরাবৃত্তভাবে বলা হয় এবং এই ডিরেক্টরিতে অনুসন্ধান করা ইত্যাদি is


3

আমি নিম্নলিখিতটি আরও ছোট এবং আরও ব্যাখ্যাযোগ্য আউটপুট সহ দেখতে পাচ্ছি:

find . -type f -printf '%TF %TT %p\n' | sort | tail -1

মানকযুক্ত আইএসওর ফর্ম্যাট তারিখের নির্দিষ্ট দৈর্ঘ্য দেওয়া, অভিধানিক বাছাই ঠিক আছে এবং আমাদের -nসাজানোর বিকল্পের দরকার নেই ।

আপনি যদি আবার টাইমস্ট্যাম্পগুলি সরাতে চান তবে আপনি ব্যবহার করতে পারেন:

find . -type f -printf '%TFT%TT %p\n' | sort | tail -1 | cut -f2- -d' '

2

statপ্রতিটি ফাইলটিতে স্বতন্ত্রভাবে চলতে থাকলে ধীরে ধীরে xargsজিনিসগুলিকে কিছুটা গতি বাড়ানোর জন্য আপনি ব্যবহার করতে পারেন :

find . -type f -print0 | xargs -0 stat -f "%m %N" | sort -n | tail -1 | cut -f2- -d" " 

2

এটি ক্রমবর্ধমানভাবে বর্তমান ডিরেক্টরিতে সমস্ত ডিরেক্টরি পরিবর্তনের সময়কে প্রতিটি ডিরেক্টরিতে নতুন ফাইলে পরিবর্তন করে:

for dir in */; do find $dir -type f -printf '%T@ "%p"\n' | sort -n | tail -1 | cut -f2- -d" " | xargs -I {} touch -r {} $dir; done

1
এটিতে খারাপভাবে ভেঙে যায় যদি কোনও ডায়ারে স্পেস থাকে - আইএফএস সেট করতে হবে এবং কোটগুলি ব্যবহার করতে হবে: আইএফএস = $ '\ n'; ডিয়ার ইন $ এর জন্য (সন্ধান করুন। / টাইপ ডি); ইকো "$ দির"; "$ দির" -প্রকার-এফ-প্রিন্টফ '% টি @ "% পি" \ n' | সন্ধান করুন সাজানো-এন | লেজ -1 | কাট -f2- -d "" | xargs -I {} touch -r {} "ir dir"; সম্পন্ন;
অ্যান্ডি লি রবিনসন

2

এই সাধারণ ক্লিপটিও কাজ করবে:

ls -1t | head -1

আপনি তালিকা তৈরি করতে চান এমন ফাইলের সংখ্যায় আপনি -1 পরিবর্তন করতে পারেন


10
না, এটি হবে না, কারণ এটি পুনরাবৃত্ত হয় না।
আরতাজ

1

আমি উপরের কমান্ডটি দরকারী হিসাবে পেয়েছি, তবে আমার ক্ষেত্রে আমার ফাইলের তারিখ এবং সময়ও দেখতে হবে এবং বেশ কয়েকটি ফাইলের নাম ছিল যা আমার কাছে ফাঁকা আছে with এখানে আমার কাজের সমাধান।

find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | sed 's/.*/"&"/' | xargs ls -l

1

নিম্নলিখিত কমান্ড সোলারিসে কাজ করেছিল:

find . -name "*zip" -type f | xargs ls -ltr | tail -1 

1

লুকানো ফাইলগুলি উপেক্ষা করা - দুর্দান্ত এবং দ্রুত সময়ের স্ট্যাম্প সহ

$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10

ফলাফল

ফাইলের নামগুলিতে স্পেসগুলি ভালভাবে পরিচালনা করে - এগুলি ব্যবহার করা উচিত নয়!

2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht

অধিক

findলিঙ্ক অনুসরণ আরও গৌরব।


1

/ টার্গেট_ডাইরেক্টরি এবং এর সমস্ত সাব-ডিরেক্টরিতে ফাইলগুলি অনুসন্ধান করতে, যেগুলি গত minutes০ মিনিটে পরিবর্তিত হয়েছে:

$ find /target_directory -type f -mmin -60

আপডেট সময়ের বিপরীতে ক্রম অনুসারে সর্বাধিক সংশোধিত ফাইলগুলি সন্ধান করতে (অর্থাত্ সর্বশেষে আপডেট হওয়া ফাইলগুলি প্রথমে):

$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

0

আমি এটি পছন্দ করি, এটি সংক্ষিপ্ত:

find . -type f -print0|xargs -0 ls -drt|tail -n 1

0

আমি এই প্রশ্নের জন্য একটি পাইপি / গিথুব প্যাকেজ লিখেছিলাম কারণ আমারও সমাধানের প্রয়োজন ছিল।

https://github.com/bucknerns/logtail

ইনস্টল করুন:

pip install logtail

ব্যবহার: লেজ ফাইল পরিবর্তন করা হয়েছে

logtail <log dir> [<glob match: default=*.log>]

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

editlatest <log dir> [<glob match: default=*.log>]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.