পুনর্বিবেচনার তারিখ অনুসারে বাছাই করা ফাইলগুলি কীভাবে তালিকাভুক্ত করা যায় (কোনও স্ট্যাট কমান্ড উপলব্ধ নেই!)


31

বর্তমান নির্দেশিকার অধীনে থাকা সমস্ত ফাইলের তালিকা পরিবর্তনের তারিখ সহ এবং সেই তারিখ অনুসারে বাছাই করতে পারি কীভাবে?

এখন আমি জানি যে কীভাবে এটি অর্জন করতে হয় find, statএবং sort, তবে কিছু অদ্ভুত কারণে statবাক্সে কারণটি ইনস্টল করা হয়নি এবং আমি এটি ইনস্টল করার সম্ভাবনা কম।

অন্য কোন বিকল্প?

পিএস: gccইনস্টল করা হয় না


আপনি কি একটি সংকলিত বাইনারি আপলোড এবং এটি চালাতে পারেন?
ইম্জ - ইভান জ্যাকারিয়াশেভ

@ আইএমজ: হ্যাঁ, এটি আরও একটি উপায়। find -printfকর্ম সবচেয়ে সহজ পদ্ধিতি হল যদিও মনে করা হয়।
অ্যালেক্স

উত্তর:


27

আমার সংক্ষিপ্ততম পদ্ধতিটি zsh ব্যবহার করে:

print -rl -- **/*(.Om)

( Dআপনি যদি লুকানো ফাইলগুলি বা গোপন ডিরেক্টরিতে ফাইলগুলি তালিকাভুক্ত করতে চান তবে গ্লোব বাছাইকারীদের যুক্ত করুন )।

আপনার যদি জিএনইউ খুঁজে পাওয়া যায় তবে এটিকে ফাইল পরিবর্তনের সময় মুদ্রণ করুন এবং এর অনুসারে বাছাই করুন। আমি ধরে নিই যে ফাইলের নামে কোনও নতুন লাইন নেই।

find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'

আপনার যদি পার্ল থাকে (আবার, ফাইলের নামগুলিতে কোনও নতুন লাইন ধরে না রেখে):

find . -type f -print |
perl -l -ne '
    $_{$_} = -M;  # store file age (mtime - now)
    END {
        $,="\n";
        print sort {$_{$b} <=> $_{$a}} keys %_;  # print by decreasing age
    }'

যদি পাইথন থাকে (আবার, ফাইলের নামে কোনও নতুন লাইন ধরে নিই):

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'

আপনার যদি সেই সার্ভারটিতে এসএসএইচ অ্যাক্সেস থাকে তবে আরও ভাল-সজ্জিত মেশিনে এসএসএফএসের মাধ্যমে ডিরেক্টরিটি মাউন্ট করুন :

mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt

কেবল পসিক্স সরঞ্জামের সাহায্যে এটি আরও জটিল, কারণ কোনও ফাইলের পরিবর্তনের সময়টি খুঁজে পাওয়ার কোনও ভাল উপায় নেই। কোনও ফাইলের সময় পুনরুদ্ধার করার একমাত্র স্ট্যান্ডার্ড উপায় lsএবং আউটপুট ফর্ম্যাটটি লোকেল-নির্ভর এবং পার্স করা শক্ত।

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

set -ef                       # disable globbing
IFS='
'                             # split $(foo) only at newlines
set -- $(find . -type f)      # set positional arguments to the file names
mkdir links.tmp
cd links.tmp
i=0 list=
for f; do                     # hard link the files to links.tmp/0, links.tmp/1, …
  ln "../$f" $i
  i=$(($i+1))
done
set +f
for f in $(ls -t [0-9]*); do  # for each file, in reverse mtime order:
  eval 'list="${'$i'}         # prepend the file name to $list
$list"'
done
printf %s "$list"             # print the output
rm -f [0-9]*                  # clean up
cd ..
rmdir links.tmp

সবচেয়ে সহজ উপায় সম্ভবত find . -print | xargs -n99999 -s999999 ls -ltr। তবে এতে সমস্যা রয়েছে যে (1) 512 এর চেয়ে বেশি বা 5120 এর বেশি xargsহতে পারে না এবং (খ) আপনি যদি এটির আশেপাশে পেতে পারেন, তখনও সংযুক্ত যুক্তি তালিকা এবং পরিবেশের জন্য কার্নেল-আরোপিত সর্বাধিক আকার রয়েছে। আপনার বেশিরভাগ ধারণাগুলির (পার্ল এবং পাইথনগুলি সংরক্ষণ করুন) একই সমস্যা রয়েছে, যার কারণে আমি বিশেষত দীর্ঘ কমান্ড লাইন তৈরি করা এড়িয়ে চলেছি। -m-s
গাইকোসর

বিশেষত, আমি নিয়মিতভাবে zshসাধারণ ক্ষেত্রে পুনরাবৃত্ত গ্লোবগুলি ব্যবহার করে "যুক্তি তালিকা খুব দীর্ঘ" ত্রুটিগুলি পাই ।
গাইকোসৌর

@ গেকোসৌর: দীর্ঘ কমান্ড লাইনের সাথে শুধুমাত্র শেষ ভয়ঙ্কর ক্লদজে সমস্যা রয়েছে। Zsh এ, আপনি বিল্ট-ইনগুলি দিয়ে অনেক কিছু করতে পারেন (উদাহরণস্বরূপ আপনার print -rl **/*কেবলমাত্র কতটা মুক্ত মেমরি রয়েছে তার সীমা) এবং এর বাইরেও zargs। আপনার প্রস্তাবটি find … | xargs … lsসঠিকভাবে বাছাই করা xargsশেষ হয়ে lsগেলে কেবল একবারই আবেদন করা শেষ হয়ে যায় , এবং যদি ফাইলের নামগুলিতে বিশেষ অক্ষর থাকে তবে তা কার্যকর হবে না।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

অপশন প্রচুর সঙ্গে অত্যন্ত বিস্তারিত উত্তরের জন্য অনেক ধন্যবাদ! :)
অ্যালেক্স

এবং সে কারণেই আমি zsh ভালবাসি।
প্রোফ্যাপাটস

14

জিএনইউ ধরে নিচ্ছেন find:

find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-

পরিবর্তন 1n,1করার জন্য 1nr,1তালিকাভুক্ত যদি আপনি ফাইল চান সাম্প্রতিকতম প্রথম।

আপনার যদি জিএনইউ না থাকে তবে findএটি আরও কঠিন হয়ে যায় কারণ lsটাইমস্ট্যাম্পের ফর্ম্যাটটির পরিমাণ এত বেশি হয় (উদাহরণস্বরূপ, পরিবর্তিত ফাইলগুলির টাইমস্ট্যাম্পের আলাদা স্টাইল রয়েছে)।


প্রকৃতপক্ষে আপনি তারিখ এবং সময় ফর্ম্যাটটিও এর সাথে পরিবর্তন করতে পারেন ls --time-style="..."- আমি নিশ্চিত নই যে এটি মানক বা জিএনইউ, সম্ভবত জিএনইউ কিনা।
22

অবশ্যই GNU।
গীকোসৌর

@ সাউন্ডমোভ: দুর্ভাগ্যক্রমে, বাক্সটি অনেক পুরানো (রেডহ্যাট .2.২) এবং lsবিকল্প নেই।
অ্যালেক্স

7

ম্যাকের জন্য কোনও প্রিন্টফ যুক্তি খুঁজে পাওয়া যায় না, তবে আপনি এটি পরিবর্তে এটি করতে পারেন:

find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'


0

যে কেউ এটি চেষ্টা করে দেখতে পারেন (যদিও এটি নিজেই তৈরি করতে হবে) https://github.com/shadkam/recentmost


6
ইউনিক্স ও লিনাক্স স্ট্যাক এক্সচেঞ্জে স্বাগতম! যতক্ষণ এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান।
slm

0

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

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

$ 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লিঙ্কটি অনুসরণ করে আরও গৌরব পাওয়া যাবে।


0

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

সন্ধানী 4.6.0 সহ আমি পছন্দ করি:

find . -type f -mtime +270 -exec ls -laFGht --time-style=iso {} \+

উপরের কমান্ডটি -type fবর্তমান ওয়ার্কিং ডিরেক্টরিতে ( .) ফাইলগুলি সন্ধান করে যা 270 দিনেরও বেশি আগে সংশোধিত হয়েছিল ( -mtime +270এছাড়াও -mtime 0শেষ 24 ঘন্টা উত্পাদন করবে এবং -mtime -5শেষ 5 দিন দেখায়)। এটি তারপরে lsতাদের তালিকা তৈরি করতে ব্যবহার করে, সর্বপ্রথম নতুন ( -exec ls -laFGht --time-style=iso {} \+)

এখানে আউটপুট একটি নমুনা:

-rwxrwx---+ 1 user1 208M 2018-07-16  ./filename.bak*
-rwxrwx---+ 1 user1  702 2018-07-15  ./filename.ldf*
-rwxrwx---+ 1 user1 208M 2018-07-15  ./filename.bak*

এ সম্পর্কে দুর্দান্ত বিষয়টি হ'ল একবার তালিকাটি পর্যালোচনা করা হলে, তালিকা অংশটি findমুছুন আদেশটি প্রতিস্থাপন করা এটি সাধারণ বিষয় :

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