পুনরাবৃত্তভাবে বৃহত্তম ফাইল সন্ধান করা


41

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

গো EX:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

এটি আমার কাছে রয়েছে:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

আমি এখন কিছুক্ষণ আটকে আছি। আমি প্রচুর বিদ্যমান ইউনিক্স সরঞ্জামগুলিকে পাইপলাইনিং করে এটি প্রয়োগ করতে পারি না। কোন ধারণা ভাল হবে!



শুধুমাত্র subdirs মধ্যে যেতে হবে: for d in */ .[^.]*/; করুন ... `
অলিভিয়ার ডুলাক

উত্তর:


54

ফাইলের আকারের সাথে ফাইলের নাম আউটপুট করতে find(এখানে জিএনইউ ধরে নিচ্ছেন find) ব্যবহার করুন । সাজান. বৃহত্তম প্রিন্ট আউট।

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

এটি ধরে নিয়েছে যে ফাইল পাথগুলিতে নতুন লাইন অক্ষর নেই।


bashGNU এর প্রয়োগের সাথে একটি লুপ ব্যবহার করে stat:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

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

-বর্তমান ডিরেক্টরিতে যদি কোনও ফাইল বলা হয়, স্টিডিনে খোলা ফাইলটির আকার বিবেচনা করা হবে।

bashডিরেক্টরি ট্রিটিতে অবতরণ করার সময় ৪.৩ এর পূর্ববর্তী সংস্করণগুলি প্রতীকী লিঙ্কগুলি অনুসরণ করুন।


ধন্যবাদ, এটি কাজ করে! আমি সাহায্যের প্রশংসা করি। আমি শেল প্রোগ্রামিং ব্যবহার করার চেষ্টা করছি। আমি এখনই পুরোটা জানি না তাই কোডের এই লাইনের সাথে কী ঘটছে তা বলার জন্য আমি আপনার প্রশংসা করি।
ব্যবহারকারী 2419571

তাত্ক্ষণিক প্রশ্ন: কৌতূহলের বাইরে পাইপিং কমান্ড ব্যতীত এটি করার কোনও উপায় আছে? আমি কৌতূহলী কারণ আমি যে প্রত্যেকে দেখেছি প্রতিটি উদাহরণ কোনওরকম পাইপ ব্যবহার করেছে।
ব্যবহারকারী 2419571

2
আমি নিশ্চিত যে এটি করার অন্যান্য উপায় আছে। ইউনিক্স দর্শনটি হ'ল সরঞ্জামগুলি একক-উদ্দেশ্যমূলক হওয়া উচিত এবং তাদের একসাথে চেইন করা যাতে একটি কমান্ডের আউটপুট পরের ইনপুটটিতে সরবরাহ করা হয়।
গ্লেন জ্যাকম্যান

এটা বোধগম্য. আপনার সাহায্যের জন্য আবার আপনাকে ধন্যবাদ.
ব্যবহারকারী 2419571

2
@ ব্যবহারকারী 2419571:; tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n")))
সাইরাস


5

এটি BSD / macOS এ কাজ করে:

find . -type f -ls | sort -k7 -r

আপনি | head -n 3আকর্ষণীয় এন্ট্রিগুলির সংখ্যা প্রদর্শন করতে সংযোজন করতে পারেন (এই ক্ষেত্রে 3)।


1
এই উত্তরটি কীভাবে কাজ করে তা ব্যাখ্যা করে উন্নত করা যেতে পারে। এছাড়াও, এটি গৃহীত উত্তরের সাথে খুব মিল (যা এটি কীভাবে কাজ করে তা পুরোপুরি ব্যাখ্যা করে না)।
ধাগ

man findএবং man sort, brainz ব্যবহার করুন :-)
CeDeROM

ম্যাকোজে সত্যই কাজ করছে না কারণ এটি আকারটি সঠিকভাবে ফিরিয়ে দিতে ব্যর্থ হয় এবং বিপুল সংখ্যক কলাম দেয়।
sorin

3

সঙ্গে zshসবচেয়ে বড় নিয়মিত ফাইলের জন্য:

ls -ld -- **/*(.DOL[1])

(অবশ্যই আপনি যে ls -ld --কোনও কমান্ড দিয়ে প্রতিস্থাপন করতে পারেন G GNU lsবা সামঞ্জস্যপূর্ণ -hব্যবহার করে মানব পাঠযোগ্য আকারের বিকল্পটিও দেখুন )

  • .: কেবলমাত্র নিয়মিত ফাইল (ডিরেক্টরি নয়, সিমলিঙ্কস, ডিভাইসগুলি, ফিফো ...)
  • D: গোপনীয়দের অন্তর্ভুক্ত করুন এবং লুকানো ডায়ারে নামুন
  • OL: আকার দ্বারা বিপরীত-অর্ডার ( Length)।
  • [1]: শুধুমাত্র প্রথম ম্যাচ।

যদি কোনও সম্পর্ক থাকে তবে এগুলির মধ্যে যেকোন একটি এলোমেলোভাবে পাবেন। আপনি যদি বর্ণানুক্রমিক ক্রমে প্রথম চান, অক্ষর বর্ণমালা অনুসারে বাছাই করার জন্য একটি অতিরিক্ত on( orme দ্বারা nরডার) যুক্ত করুন।

দ্রষ্টব্য যে এটি ফাইলগুলির আকার বিবেচনা করে, ডিস্ক ব্যবহার নয়।


... আমি বিশ্বাস করতে শুরু করি যে আপনি zsh এর বেতনভুক্ত;) (যা এটি খুব ভাল হতে পারে?)। zsh দুর্ভাগ্যক্রমে সমস্ত সিস্টেমে উপলভ্য নয় ...
অলিভিয়ার ডুলাক

প্রথম দশটি ফাইল পাওয়া সম্ভব? (একটি লুপের মতো বোকা কিছু না করে)
ওয়াওফুনহাপি

1
প্রতিস্থাপন @Wowfunhappy [1]সঙ্গে[1,10]
Stéphane Chazelas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.