पुनरावर्ती रूप से संशोधन तिथि द्वारा क्रमबद्ध फ़ाइलों को कैसे सूचीबद्ध किया जाए (कोई स्टैट कमांड उपलब्ध नहीं है!)


31

मैं वर्तमान निर्देशिका के अंतर्गत सभी फ़ाइलों की सूची उनकी संशोधन तिथि के साथ कैसे प्राप्त कर सकता हूं और उस तिथि के अनुसार क्रमबद्ध कर सकता हूं?

अब मुझे पता है कि इसे कैसे हासिल किया जा सकता है find, statऔर sort, लेकिन कुछ अजीब कारणों statसे बॉक्स पर स्थापित नहीं किया गया है और यह संभावना नहीं है कि मैं इसे स्थापित कर सकता हूं।

कोई अन्य विकल्प?

PS: 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'

यदि आपके पास उस सर्वर तक एसएसएच पहुंच है, तो बेहतर सुसज्जित मशीन पर sshfs पर निर्देशिका माउंट करें :

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

केवल POSIX टूल के साथ, यह बहुत अधिक जटिल है, क्योंकि फ़ाइल के संशोधन समय को खोजने का कोई अच्छा तरीका नहीं है। फ़ाइल के समय को पुनर्प्राप्त करने का एकमात्र मानक तरीका है 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को सामान्य मामले में पुनरावर्ती ग्लब्स का उपयोग कर प्राप्त करता हूं ।
22

@geekosaur: केवल आखिरी भयानक कीचड़ में लंबी कमांड लाइनों की समस्या है। 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सूचीबद्ध करता है, तो आप फ़ाइलों को चाहते हैं नवीनतम प्रथम।

यदि आपके पास GNU नहीं है तो findयह और कठिन हो जाता है क्योंकि lsटाइमस्टैम्प प्रारूप बहुत भिन्न होता है (हाल ही में संशोधित फ़ाइलों में टाइमस्टैम्प की एक अलग शैली है, उदाहरण के लिए)।


वास्तव में आप दिनांक और समय प्रारूप को भी बदल सकते हैं ls --time-style="..."- मुझे यकीन नहीं है कि यह मानक है या GNU ls, संभवतः GNU है।
asoundmove

निश्चित रूप से जीएनयू।
गीकौसोर

@asoundmove: दुर्भाग्य से, बॉक्स बहुत पुराना है (RedHat 7.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
यूनिक्स और लिनक्स स्टैक एक्सचेंज में आपका स्वागत है! जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
स्लम

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 दिनों से अधिक समय पहले संशोधित की गई फाइलें ( ) मिलती हैं , ( पिछले 24 घंटों का उत्पादन -mtime +270भी -mtime 0होगा, और -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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.