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


38

আমি যদি উপ-ডিরেক্টরিগুলি সহ একটি বড় (ডিরেক্টরি) ডিরেক্টরিতে সর্বশেষ ফাইল (এমটাইম) সন্ধান করতে চাই তবে আমি কীভাবে এটি করব?

প্রচুর পোস্টে আমি খুঁজে পেয়েছি ls -lt | head(মজাদারভাবে, অনেকগুলি ls -ltr | tailযা একই তবে কম দক্ষ) এর কিছু প্রকারের প্রস্তাব দেয় যা আপনার সাব-ডিরেক্টরীগুলি না থাকলে ভাল (আমি না করি)।

তারপরে আবারও তুমি পারো

find . -type f -exec ls -lt \{\} \+ | head

যা অবশ্যই একটি কমান্ড দ্বারা নির্দিষ্ট করা যেতে পারে যতগুলি ফাইলের জন্য কৌশলটি করবে, যেমন আপনার কাছে যদি একটি বড় ডিরেক্টরি থাকে তবে -exec...\+আলাদা কমান্ড জারি করবে; সুতরাং প্রতিটি গ্রুপ lsনিজের মধ্যে বাছাই করা হবে তবে মোট সেট নয়; মাথা তাই প্রথম ব্যাচের সর্বশেষতম এন্ট্রি নিতে হবে।

কোন উত্তর?


বিটিডব্লিউ, আপনার এই সমস্ত ব্যাকস্ল্যাশগুলির কোনওটির প্রয়োজন নেই।
এনজোটিব

@enzotib: আপনি কি ( \ + + ), অন্যথায় আপনি পেতেfind: missing argument to '-exec'
ব্যবস্থা

@ অ্যারেঞ্জ: আমার এই ত্রুটি +নেই, যার কোনও অর্থ নেই bash, সুতরাং এড়াতে হবে না।
এনজোটিব

@ এঞ্জোটিব: আপনি ঠিক বলেছেন, আমার ভুল, দুঃখিত
সাজান

উত্তর:


46

আপনাকে বাহ্যিক আদেশগুলি (যেমন ls) এর পুনরাবৃত্তি করার দরকার নেই কারণ findএই -printfক্রিয়াটির মাধ্যমে আপনার যা প্রয়োজন তা করতে পারেন :

find /path -printf '%T+ %p\n' | sort -r | head

1
হ্যাঁ, আমি নিয়ে এসেছি find . -type f -exec stat --format=%y \{\} \+ | sort -r | head -n1তবে আপনার সমাধানটি আরও পরিষ্কার!
ধনী

3
| cut -d ' ' -f2কেবল ফাইলের নাম পেতে যোগ করুন
কিউউআর

আপনি headনির্দিষ্ট সংখ্যক লাইন অন্তর্ভুক্ত করার জন্য আউটপুটও কুল করতে পারেন । আমার কেবল প্রথম লাইনের প্রয়োজন ছিল, তাই আমি ব্যবহার করেছিhead -n 1
টিম্মাহ

8

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

ls -tp | grep -v /$ | head -1

-pবিকল্প lsডিরেক্টরি করার জন্য একটি trailing স্ল্যাশ যোগ করে, grep -vঅপসারণ লাইন স্ল্যাশ (ওরফে, সমস্ত ডিরেক্টরি) শেষ হওয়া এবং head -1সীমা ফাইল আউটপুট।

findআপনি যে সমস্ত ফিরিয়ে দিতে চান তা ফাইলের নাম হলে এটি ব্যবহার করার চেয়ে ভার্বোজটি অনেক কম ose


এটি উপ-ডিরেক্টরিগুলি পরিচালনা করে না।
ক্লাইমেন্ট

4

এটি আমার সিস্টেমে দ্রুততর printf, যদিও আমি বুঝতে পারি না

find /path -type f -exec stat -c "%y %n" {} + | sort -r | head

আমি নিশ্চিত, দ্রুত।
এনজোটিব

আরও একটি বিষয়, ... | sort -r | head -n1 | cut -d " " -f 4-আপনি যদি কেবল ফাইলের নাম পেতে চান।
林果皞

আমি সবেমাত্র sort -rভুল দেখতে পেয়েছি যদি একাধিক লাইন জুড়ে ফাইলের নাম বিদ্যমান থাকে।
林果皞

2

সম্পাদনা: আমার ধারণা এই পোস্টটি 'বিশেষত কার্যকর নয়' যেমনটি আমি ভেবেছিলাম। এটি একটি অতি দ্রুত সমাধান যা কেবলমাত্র সর্বাধিক সংশোধিত ফাইলের ট্র্যাক রাখে (ফাইলগুলির সম্পূর্ণ তালিকা বাছাইয়ের পরিবর্তে):

find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '

স্বচ্ছতার জন্য একাধিক লাইনে ছড়িয়ে দেওয়া নীচের মত দেখায়:

find . -type f -printf '%T@ %p\n' | awk '
    BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; }
    {
        if ($1 > mostrecenttime)
            { mostrecenttime = $1; mostrecentline = $0; }
    }
    END { print mostrecentline; }' | cut -f2- -d ' '

EDIT এর সমাপ্তি


একটি বিশেষ দরকারী পোস্ট নয় তবে যেহেতু 'অ্যারেঞ্জ' গতি নিয়ে আলোচনা করছিল, তাই আমি ভেবেছিলাম এটি ভাগ করে নিই।

অ্যারেজট এবং এনজোটিবের সমাধানগুলিতে ডিরেক্টরীতে সমস্ত ফাইলকে তাদের টাইমস এবং তারপরে বাছাইয়ের সাথে জড়িত। আপনি জানেন যে বাছাই সর্বাধিক সন্ধান করা প্রয়োজন হয় না। লিনিয়ার সময় সর্বাধিক সন্ধান করা যায় তবে বাছাইয়ের জন্য এন লগ (এন) সময় লাগে [আমি জানি পার্থক্যটি খুব বেশি নয় তবে এখনও রয়েছে;)]। আমি এটি বাস্তবায়নের একটি পরিষ্কার উপায় সম্পর্কে ভাবতে পারি না। [সম্পাদনা: একটি ঝরঝরে (নোংরা চেহারা সত্ত্বেও) এবং উপরে সরবরাহ করা দ্রুত বাস্তবায়ন]]

পরবর্তী সেরা জিনিস - কোনও ডিরেক্টরিতে সর্বাধিক সম্পাদিত ফাইল সন্ধান করতে, প্রতিটি স্তরের 1 উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে সর্বাধিক সম্পাদিত ফাইলটি সন্ধান করুন। এই ফাইলটি উপ-ডিরেক্টরিটি উপস্থাপন করুন। স্তর 1 সাবডাইরেক্টরিগুলির প্রতিনিধিদের সাথে স্তরের 1 ফাইলগুলি সাজান। প্রতিটি ডিরেক্টরিতে স্তরের 1 টি ফাইল এবং সাব-ডায়ারের সংখ্যা যদি প্রায় ধ্রুবক হয় তবে এই প্রক্রিয়াটি মোট ফাইলের সংখ্যার সাথে রৈখিকভাবে স্কেল করা উচিত।

এটিই এটিকে বাস্তবায়নের জন্য নিয়ে এসেছি:

findrecent() { { find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1; }
findrecent .

আমি এটি চালিয়েছি এবং একগুচ্ছ find: findrecent: No such file or directoryত্রুটি পেয়েছি । কারণ: -সেক্স একটি ভিন্ন শেলের মধ্যে রান খুঁজে পাওয়া যায়। আমি .bashrc, .xsessionrc এ ফাইন্ডারেন্ট সংজ্ঞায়নের চেষ্টা করেছি তবে এগুলি সাহায্য করেনি [আমি এখানে সহায়তার প্রশংসা করি]। শেষ পর্যন্ত আমি নির্বাণ অবলম্বন

#!/bin/bash
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;

findrecentআমার পাঠানো স্ক্রিপ্টে এবং তারপর এটি চালাচ্ছে।

আমি এটি দৌড়েছি, অপেক্ষায় আছি এবং কোনও আউটপুট ছাড়াই অপেক্ষা করতে থাকি। কেবলমাত্র নিশ্চিত হতেই আমি ফাইলটিতে যে কোনও অসীম লুপগুলি সংশোধন করেছি তার সাথে আমি व्यवहार করিনি

#!/bin/bash
echo "$1" >&2
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;

এবং আবার চেষ্টা। এটি কাজ করেছে - তবে আমার হোমফোল্ডারে 1 মিনিট 35 সেকেন্ড সময় নিয়েছে - অ্যারেঞ্জমেন্টের এবং এনজোটিবের সমাধানগুলি যথাক্রমে 1.69, 1.95 সেকেন্ড নিয়েছিল!

ও (এন) এর চেয়ে ও (এন লগ (এন)) এর শ্রেষ্ঠত্বের পক্ষে এত কি! অভিশাপ আপনি কল ওভারহেড ফাংশন! [বা বরং স্ক্রিপ্ট কল ওভারহেড]

তবে এই স্ক্রিপ্টটি পূর্বের সমাধানগুলির চেয়ে আরও ভাল স্কেল করে এবং আমি বাজি ধরি এটি গুগলের মেমরি ব্যাঙ্কে তাদের চেয়ে দ্রুত চলবে; ডি


2

এর perlসাথে কনজোঁটিনে ব্যবহার করুন find:

 find my_directory -type f -printf '%T@\t%p\n' | perl -ane '@m=@F if ($F[0]>$m[0]); END{print $m[1];}'

আপনি সর্বশেষতম যুগের সাথে == শেষ ফাইলটি পরিবর্তিত করে ফাইলটির নাম পান।


1

এটি প্রায় ফ্যাশনেবল নয়, তবে মিডনাইট কমান্ডারের সাহায্যে এটি অর্জন করাও সম্ভব : * অনুসন্ধান করুন, ফলাফলকে প্যানেলাইজ করুন, বিপরীত ক্রমে পরিবর্তনের সময় অনুসারে বাছাই করুন।

স্পষ্টতই, এটি এর চেয়ে কিছুটা ধীরে ধীরে find- 922000 ফাইলযুক্ত আমার হোম ডিরেক্টরিটি mcপ্রায় 14 মিনিটের মধ্যে find5 এরও কম ব্যয় করার সময় সাজানো হয়েছিল - তবে এর কিছু সুবিধা রয়েছে:

  • আমি সম্ভবত 9 মিনিটের পার্থক্যটি সঠিকভাবে সন্ধানের অনুরোধটি আবিষ্কার করতে পারতাম :)

  • ত্রুটির কম সম্ভাবনা (সাজানোর জন্য -r নির্দিষ্ট করতে ভুলে গিয়েছিলেন - আবার শুরু করুন)

  • সাজানোর ক্রম ইত্যাদি পরিবর্তন করে ফলাফল সেট দিয়ে খেলানো সম্ভব - ফাইলগুলি পুনরায় জিজ্ঞাসা না করে।

  • ফলাফল সেট থেকে কিছু ফাইলের মধ্যে ফাইল ক্রিয়াকলাপ সম্পাদন করা সম্ভব - অর্থাত্ আকার অনুসারে বাছাই করা দরকার না এমন কয়েকটি বড় ফাইল মুছুন

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