লিনাক্সের একটি ডিরেক্টরিতে সাম্প্রতিকতম ফাইলটি পান Get


183

এমন একটি কমান্ড খুঁজছেন যা ডিরেক্টরিতে একক সাম্প্রতিকতম ফাইলটি ফিরিয়ে দেবে।

এর কোনও সীমা পরামিতি দেখছেন না ls...


1
watch -n1 'ls -Art | tail -n 1'- খুব শেষ ফাইলগুলি দেখায়

এখানে বেশিরভাগ উত্তর বিরক্তিকর ফাইল-নামগুলি পরিচালনা করার জন্য সমস্যাযুক্ত যা ছাড়াই lsবা তার ব্যবহারের আউটপুটকে বিশ্লেষণ করে । সর্বদা উল্লেখ করার জন্য দরকারী: বাশফিউএইউ 099 যা এই সমস্যার একটি পসিক্স উত্তর দেয়find-print0
kantantur

উত্তর:


266
ls -Art | tail -n 1

খুব মার্জিত নয়, তবে এটি কাজ করে।


2
এলএস -আর্টলস ব্যবহার করে আপনি ফাইলের তারিখও দেখতে পারেন।
জোসির

13
একটি ছোটখাটো সমস্যা: এই সংস্করণটি সমস্ত আউটপুট পাইপ lsদেয় tail, তারপরে কেবল সর্বশেষ লাইনটি মুদ্রণ করে। IMHO আরোহী ক্রম অনুসারে বাছাই করা এবং headপরিবর্তে ব্যবহার করা ভাল, chaosপ্রস্তাবিত হিসাবে । প্রথম লাইনের শীর্ষস্থানীয় lsপ্রস্থান মুদ্রণের পরে, সুতরাং পরবর্তী লাইনটি (আসলে পরবর্তী ব্লক) প্রেরণ করা একটি SIGPIPE বৃদ্ধি করবে এবং পাশাপাশি প্রস্থান করবে।
সত্য

1
@ ট্রুই ওয়াই আমি বেশ একমত দক্ষতার জন্য বিশৃঙ্খলার উত্তর আরও ভাল।
ডিএমকেই --- প্রাক্তন মডারেটর বিড়ালছানা

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

2
আমি মনে করি যে মাথার পরিবর্তে লেজ ব্যবহারের উদ্দেশ্যটি হ'ল এলএস দ্বারা প্রদত্ত মোটের বর্ণনা দিয়ে রেখার অন্তর্ভুক্তি বাদ দেওয়া উচিত।
পিটার স্কট

155
ls -t | head -n1

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


আমার সমতুল্য এবং সম্ভবত আরও দক্ষ।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

আমি প্রথমে আমার এলএসে কিছু তথ্য প্রতিধ্বনিত করার পরে আমার পক্ষে বেশ কার্যকর হয় না, তবে আমি ব্যবহারটি পাই, ধন্যবাদ!
ack

4
@ জোসির এটি দিয়ে ডেটস্ট্যাম্প অন্তর্ভুক্ত করতে সংশোধন করা যেতে পারে এবং পাইপটি দিয়ে আমার পুরোভাবে টেবিলটি চাপতে হবে ls -tl | head -n 1না।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

1
@ noɥʇʎԀʎzɐɹƆls -t *.png | head -n1
বিশৃঙ্খলা

4
এটি সর্বশেষতম সংশোধিত হলে এটি একটি ফোল্ডারটি ফেরত দেয়, ব্যবহার করুন: ls -Art | head -n1আপনি যদি বিশেষত সর্বশেষতম পরিবর্তিত ফাইল চান
আচসিংহ

79

এটি একটি পুনরাবৃত্ত সংস্করণ (যেমন এটি একটি নির্দিষ্ট ডিরেক্টরি বা এর কোনও উপ-ডিরেক্টরিতে সর্বাধিক আপডেট হওয়া ফাইলটি খুঁজে পায়)

find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1

সম্পাদনা করুন: কেভিনের পরামর্শ অনুযায়ী -f 2-পরিবর্তে ব্যবহার করুন-f 2


5
এখানে ম্যাকের একটি সমাধান রয়েছে:find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
ব্যবহারকারী

2
সমস্যাটি হ'ল কাট কমান্ডটি -f 2 এর পরিবর্তে ফাঁকা জায়গাগুলি দিয়ে পাথ কেটে ফেলবে -f2- লাইনের শেষের দিকে 2 ক্ষেত্রগুলি ফেরাতে
কেভিন

2
বিশৃঙ্খলা দ্বারা প্রস্তাবিত হিসাবে sort -nr, আপনি ব্যবহার করে বাছাই বিপরীত , আপনি head -n 1পরিবর্তে ব্যবহার করতে tail -n 1এবং সামান্য দক্ষতা উন্নত করতে পারেন । (যদিও আপনি যদি পুনরাবৃত্ত অনুসন্ধানগুলি বাছাই করেন তবে প্রথম বা শেষ লাইন পাওয়া ধীর অংশ হবে না))
ডিসটেনসন

2
খুব দরকারী! find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
সাইমন

@ ব্যবহারকারীর ম্যাক সংস্করণটি সময় নয়, কেবল তারিখ বাছাই করে / প্রদর্শন করে। এখানে একটি স্থির সংস্করণ রয়েছে:find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
yoz

11

নির্ভরযোগ্যতা সম্পর্কে একটি নোট:

যেহেতু নতুন লাইনের চরিত্রটি কোনও ফাইলের নামের মতোই বৈধ, তাই / ভিত্তিকের মতো লাইনে নির্ভর করে যে কোনও সমাধান ত্রুটিযুক্ত।headtail

GNU এর সাথে lsঅন্য একটি বিকল্প হ'ল --quoting-style=shell-alwaysবিকল্প এবং একটি bashঅ্যারে ব্যবহার করা:

eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"

( -Aআপনি lsযদি লুকানো ফাইলগুলি বিবেচনা করতে চান তবে বিকল্পটি যুক্ত করুন )।

আপনি যদি নিয়মিত ফাইলগুলিতে সীমাবদ্ধ করতে চান (ডিরেক্টরিগুলি, ফিফোস, ডিভাইসগুলি, সিমলিংকগুলি, সকেটগুলি ... উপেক্ষা করুন), আপনাকে জিএনইউ অবলম্বন করতে হবে find

4.4 বাশ বা আরও নতুন (জন্য readarray -d) এবং জিএনইউ কোর্টিলস 8.25 বা আরও নতুন (এর জন্য cut -z) সহ:

readarray -t -d '' files < <(
  LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
  sort -rzn | cut -zd/ -f2)

((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"

বা পুনরাবৃত্তির সাথে:

readarray -t -d '' files < <(
  LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
  sort -rzn | cut -zd/ -f2-)

এই সমস্ত ঝামেলা এড়ানোর zshপরিবর্তে এখানে ব্যবহার করা এবং তার গ্লোব কোয়ালিফায়ার সেরা হবে bash:

বর্তমান ডিরেক্টরিতে নতুন নিয়মিত ফাইল:

printf '%s\n' *(.om[1])

লুকানো রয়েছে সহ:

printf '%s\n' *(D.om[1])

দ্বিতীয় নতুন:

printf '%s\n' *(.om[2])

সিমলিংক রেজোলিউশনের পরে ফাইলের বয়স পরীক্ষা করুন:

printf '%s\n' *(-.om[1])

recursively:

printf '%s\n' **/*(.om[1])

এছাড়াও, সম্পূর্ণকরণ সিস্টেম ( compinitএবং সহ) সক্ষম করার সাথে, Ctrl+Xmএকটি পরিপূর্ণ হয়ে ওঠে যা সর্বশেষতম ফাইলে প্রসারিত হয়।

তাই:

ষষ্ঠ Ctrl+Xm

আপনাকে সর্বশেষতম ফাইলটি সম্পাদনা করতে সক্ষম করবে (এটি চাপ দেওয়ার আগে আপনি এটি দেখার সুযোগ পাবেন Return)।

ষষ্ঠ Alt+2Ctrl+Xm

দ্বিতীয় নতুন ফাইলের জন্য।

vi * .সিCtrl+Xm

নতুন cফাইলের জন্য।

vi * (।)Ctrl+Xm

নতুন নিয়মিত ফাইলের জন্য (ডিরেক্টরি নয়, ফিফো / ডিভাইস নয় ...) এবং আরও অনেক কিছু so


zshটিপস জন্য ধন্যবাদ । আপনি zsh ডক্সে এই সম্পর্কে আরও বিশদে একটি লিঙ্ক সরবরাহ করতে পারেন?
কি ফ্রিজ হইয়া গেল

@ ফ্রিজড, দেখুনinfo zsh qualifiers
স্টিফেন চেজেলাস

ধন্যবাদ @Stephane Chazelas
ফ্রিজ হইয়া গেল

9

আমি ব্যবহার করি:

ls -ABrt1 --group-directories-first | tail -n1

এটি আমাকে ফোল্ডারগুলি বাদ দিয়ে কেবল ফাইলের নাম দেয়।


কোনও ডিরেক্টরিতে কেবল ডিরেক্টরি না থাকলে
ealfonso

8

ls -lAtr | tail -1

অন্যান্য সমাধানগুলিতে শুরু হওয়া ফাইলগুলি অন্তর্ভুক্ত নয় '.'

এই আদেশে অন্তর্ভুক্ত থাকবে '.'এবং '..'যা আপনি যা চান তা নাও হতে পারে:

ls -latr | tail -1


এই কি ফিরে আসবে "।" ডিরেক্টরিটি যদি কোনও ফাইল অন্তর্ভুক্ত করে খুব সম্প্রতি সংশোধন করা হয় (মুছে ফেলার মাধ্যমে বলুন)? হতে পারে এটি পছন্দসই আচরণ, নাও হতে পারে। তবে আপনি ঠিক যেভাবেই আছেন।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা


5

আমি echo *(om[1])( zshসিনট্যাক্স) পছন্দ করি যেহেতু এটি কেবল ফাইলের নাম দেয় এবং অন্য কোনও আদেশ দেয় না।


1
আপনি zsh ব্যবহার করে থাকলে ঠিকঠাক কাজ করে। আপনি zsh ব্যবহার করছেন না? আমি মনে করি উবুন্টুতে বাশ ডিফল্ট; আপনি zsh ইনস্টল করতে পারেন, বা ব্যাশের জন্য সমতুল্য আদেশ পাবেন find
মাইকেবি

3
কমান্ডটি "প্রতিধ্বনি"; এটি কেবলমাত্র এর প্যারামিটারগুলি মূল্যায়ন করে স্ট্যান্ডার্ড আউটপুটে প্রেরণ করে। এই ক্ষেত্রে, গ্লোব কোয়ালিফায়ার "ওম [1]" এর "ও" রয়েছে, যার অর্থ মিলিত ফাইলগুলি "এম" দ্বারা অর্ডার করুন, যা সময় পরিবর্তিত হয়। এবং সেই আদেশিত তালিকা থেকে [1] নিন, যা প্রথম ফাইল। আপনি গ্লোব
Expansion.html#

4

ফাইলের সংখ্যা সত্যিই বড় না হওয়া অবধি সন্ধান / সাজানোর সমাধান দুর্দান্ত কাজ করে (পুরো ফাইল সিস্টেমের মতো)। সর্বাধিক সাম্প্রতিক ফাইলের ট্র্যাক রাখতে তার পরিবর্তে বিশ্রী ব্যবহার করুন:

find $DIR -type f -printf "%T@ %p\n" | 
awk '
BEGIN { recent = 0; file = "" }
{
if ($1 > recent)
   {
   recent = $1;
   file = $0;
   }
}
END { print file; }' |
sed 's/^[0-9]*\.[0-9]* //'

3

আমি ব্যক্তিগতভাবে যতটা বিল্ট-ইন bashকমান্ড করতে পারি তার চেয়ে কম ব্যবহার করতে পছন্দ করি (ব্যয়বহুল কাঁটাচামচ এবং এক্সিকিউটিভ সাইকেলের সংখ্যা হ্রাস করতে)। তারিখ অনুসারে বাছাই করা lsপ্রয়োজন। তবে ব্যবহার headসত্যিই প্রয়োজন হয় না। আমি নিম্নলিখিত ওয়ান-লাইনার ব্যবহার করি (কেবল নাম পাইপ সমর্থনকারী সিস্টেমে কাজ করে):

read newest < <(ls -t *.log)

বা প্রাচীনতম ফাইলটির নাম পেতে

read oldest < <(ls -rt *.log)

(দুটি '<' চিহ্নের মধ্যে স্থান মনে রাখবেন!)

যদি লুকানো ফাইলগুলিরও প্রয়োজন হয় - একটি আর্গ যোগ করা যেতে পারে।

আমি আশা করি এটি সাহায্য করতে পারে।


আপনার ব্যাখ্যা করা উচিত যে ফাইলের নামটি $ সবচেয়ে পুরানো / সর্বশেষতম ভারে সঞ্চিত। তবে কাঁটাচামানের পরিমাণের জন্য +1।
স্কোয়াট্যাটম

@ স্পোয়ারিয়েটম আমি ভেবেছিলাম অন্তর্নির্মিত মোটামুটি ভাল জানেন। তবে আপনি ঠিক বলেছেন, সম্ভবত না। আপনার মন্তব্যের জন্য ধন্যবাদ!
01

3
ধরে নেওয়া আপনার বিল্ট-ইন কী তা জানেন, আপনি সম্ভবত সঠিক। তবে, আমি কেবল ওপি-র প্রশ্নটি নিয়ে ভাবছিলাম। তারা একটি আদেশ চেয়েছিল যা কিছু ফিরিয়ে দেবে। প্রযুক্তিগতভাবে আপনার সমাধান কিছুই আউটপুট দেয় না। সুতরাং কেবল "&& এর প্রতিধ্বনি $
সর্বাধিক

3

আর रिकরসিভ বিকল্পটি ব্যবহার করে .. আপনি এখানে ভাল উত্তরের জন্য বর্ধন হিসাবে বিবেচনা করতে পারেন

ls -arRtlh | tail -50

2
ls -t -1 | sed '1q'

ফোল্ডারে সর্বশেষ পরিবর্তিত আইটেমটি প্রদর্শিত হবে। grepকীওয়ার্ড সহ সর্বশেষ এন্ট্রিগুলি সন্ধানের সাথে যুক্ত করুন

ls -t -1 | grep foo | sed '1q'

'1 কিউ' কি? 1প্রথম লাইনের সাথে head -n 1কি কি?
হ্যাট্রিকএনজেড

2

recursively:

find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head

1

এই সহজ কমান্ড চেষ্টা করুন

ls -ltq  <path>  | head -n 1

আপনি যদি ফাইলের নাম চান - সর্বশেষ পরিবর্তিত, পথ = /ab/cd/*.log

আপনি যদি ডিরেক্টরি নামটি চান - সর্বশেষ পরিবর্তিত, পথ = / আবদ / সিডি / * /


1

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

ls -rt | tail -n 1

অন্যভাবে

ls -Art | tail -n 1


0

এই সমস্ত ls / পুচ্ছ সমাধান একটি ডিরেক্টরি ফাইলের জন্য পুরোপুরি সূক্ষ্ম কাজ - সাব ডিরেক্টরি ডিরেক্টরি উপেক্ষা।

আপনার অনুসন্ধানে সমস্ত ফাইল অন্তর্ভুক্ত করার জন্য (পুনরাবৃত্তভাবে), অনুসন্ধানটি ব্যবহার করা যেতে পারে। জিওলে ফর্ম্যাট ফাইন্ড আউটপুটটি বাছাইয়ের পরামর্শ দিয়েছে। তবে হোয়াইটস্পেসগুলি সম্পর্কে সতর্কতা অবলম্বন করুন (তাঁর পরামর্শ সাদা অংশের সাথে কাজ করে না)।

এটি সমস্ত ফাইলের নামের সাথে কাজ করা উচিত:

find $DIR -type f -printf "%T@ %p\n" | sort -n | sed -r 's/^[0-9.]+\s+//' | tail -n 1 | xargs -I{} ls -l "{}"

এই ধরণের সময় অনুসারে, মানুষকে দেখুন:

%Ak    File's  last  access  time in the format specified by k, which is either `@' or a directive for the C `strftime' function.  The possible values for k are listed below; some of them might not be available on all systems, due to differences in `strftime' between systems.
       @      seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.
%Ck    File's last status change time in the format specified by k, which is the same as for %A.
%Tk    File's last modification time in the format specified by k, which is the same as for %A.

তাই প্রতিস্থাপন %Tসঙ্গে %Cctime দ্বারা সাজাতে হয়।


আপনি @ জিওলির পরামর্শের সাথে শ্বেত স্পেস সমস্যাটি সম্পর্কে সঠিক, তবে এটি ঠিক করার জন্য আপনাকে কেবলমাত্র -f বিকল্পে একটি হাইফেন যুক্ত করতে হবে: find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1 বা বিকল্পভাবে, প্রথম ক্ষেত্রটি বাদে সমস্ত কিছু রাখুন: find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
অ্যারন

0

একটি প্যাটার্ন অনুসারে প্রতিটি ডিরেক্টরিতে সর্বাধিক বর্তমান ফাইল সন্ধান করা, উদাহরণস্বরূপ "tmp" (কেস সংবেদনশীল) দিয়ে শেষ হওয়া ওয়ার্কিং ডিরেক্টরিটির সাব ডিরেক্টরিগুলি:

find . -iname \*tmp -type d -exec sh -c "ls -lArt {} | tail -n 1" \;

0
ls -Frt | grep "[^/]$" | tail -n 1

1
অন্যান্য উত্তরগুলি রয়েছে যা ওপির প্রশ্ন সরবরাহ করে এবং এগুলি বহু বছর আগে পোস্ট করা হয়েছিল। উত্তর পোস্ট করার সময়, দয়া করে নিশ্চিত হন যে আপনি একটি নতুন সমাধান যুক্ত করেছেন, বা যথেষ্ট উত্তম ব্যাখ্যা, বিশেষত পুরানো প্রশ্নের উত্তর দেওয়ার সময়।
help-info.de

2
@ help-info.de দয়া করে কেবল উত্তর-উত্তরগুলি মুছতে ভোট দিন না। এগুলি দুর্দান্ত নাও হতে পারে, তবে মুছে ফেলা এমন জিনিসগুলির জন্য যা উত্তর নয়
মাচাভিটি

@ মাচাভিটি - আমি আশা করি ব্যর্থ না হয়ে কেবল দেরী উত্তরের জন্য একটি মন্তব্য করেছি।
help-info.de

0

আপনি যদি কোনও সাব-ডাইরেক্টরিও সহ সাম্প্রতিকতম পরিবর্তিত ফাইল পেতে চান তবে এই ছোট অনলাইনারের সাহায্যে এটি করতে পারেন:

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done

আপনি যদি একই পরিবর্তন করতে চান ফাইলগুলি না করতে চান তবে অ্যাক্সেস করা ফাইলের জন্য আপনার সাধারণ পরিবর্তন করতে হবে

স্টেট কমান্ড থেকে % X এ % Y পরামিতি । এবং সাম্প্রতিক অ্যাক্সেস করা ফাইলগুলির জন্য আপনার কমান্ডটি দেখতে এমন দেখাচ্ছে:

find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done

উভয় কমান্ডের জন্য আপনি var = "1" পরামিতি পরিবর্তন করতে পারেন যদি আপনি কেবল একটি ফাইলের চেয়ে বেশি ফাইল তালিকাভুক্ত করতে চান।


-1

আমারও এটি করা দরকার ছিল এবং আমি এই আদেশগুলি পেয়েছি। এই আমার জন্য কাজ:

যদি আপনি ফোল্ডারে (অ্যাক্সেসের সময়) তৈরির তারিখ অনুসারে শেষ ফাইলটি চান:

ls -Aru | tail -n 1  

এবং আপনি যদি সর্বশেষ ফাইলটি চান তবে এর সামগ্রীতে পরিবর্তন রয়েছে (সময় পরিবর্তন করুন):

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