ऐसा लगता है कि ls
पुनरावर्ती कॉल करते समय फ़ाइलों को सही ढंग से सॉर्ट नहीं करता है:
ls -altR . | head -n 3
मैं एक निर्देशिका में सबसे हाल ही में संशोधित फ़ाइल (उपनिर्देशिका सहित) कैसे पा सकता हूं?
ऐसा लगता है कि ls
पुनरावर्ती कॉल करते समय फ़ाइलों को सही ढंग से सॉर्ट नहीं करता है:
ls -altR . | head -n 3
मैं एक निर्देशिका में सबसे हाल ही में संशोधित फ़ाइल (उपनिर्देशिका सहित) कैसे पा सकता हूं?
जवाबों:
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "
एक विशाल पेड़ के लिए, sort
सब कुछ स्मृति में रखना कठिन हो सकता है ।
%T@
आपको एक यूनिक्स टाइमस्टैम्प की तरह संशोधन समय देता है, sort -n
संख्यात्मक रूप से, tail -1
अंतिम पंक्ति (उच्चतम टाइमस्टैम्प) लेता cut -f2 -d" "
है, आउटपुट से पहले फ़ील्ड ( टाइमस्टैम्प) को काट देता है।
संपादित करें: जैसा -printf
कि शायद GNU- केवल है, ajreals का उपयोग stat -c
भी है। हालांकि बीएसडी पर ऐसा करना संभव है, स्वरूपण के लिए विकल्प अलग हैं ( -f "%m %N"
ऐसा प्रतीत होता है)
और मुझे बहुवचन का हिस्सा याद आया; आप और अधिक तो चाहते हैं, तो नवीनतम फ़ाइल, बस पूंछ तर्क तक सामने लाना।
sort -rn | head -3
इसके स्थान पर उपयोग स्विच कर सकते हैं sort -n | tail -3
। एक संस्करण सबसे पुरानी से नई तक की फाइलें देता है, जबकि दूसरा सबसे पुरानी से नई में जाता है।
sort
आवश्यकतानुसार अस्थायी फ़ाइलें (में /tmp
) बनाएंगे , इसलिए मुझे नहीं लगता कि यह चिंता का विषय है।
-printf '%T@ %Tb %Td %TY %p\n'
आपको एक तारीख मोहर देगा (यदि आवश्यक हो) (समान ls
)
find . -type f -printf '%TF %TT %p\n' | sort | tail -1
पर बाद @ plundra का जवाब है, यहाँ बीएसडी और ओएस एक्स संस्करण है:
find . -type f -print0 | xargs -0 stat -f "%m %N" |
sort -rn | head -1 | cut -f2- -d" "
find
समर्थन +
करता है \;
? क्योंकि वह एक ही काम करता है (कई फाइलों को मापदंडों के रूप में पारित करना), -print0 | xargs -0
पाइप के बिना ।
head -1
हैंhead -5
परिणामों को छांटने और केवल अंतिम संशोधित लोगों को रखने के बजाय, आप awk का उपयोग केवल सबसे बड़े संशोधन समय (यूनिक्स समय में) के साथ प्रिंट करने के लिए कर सकते हैं:
find . -type f -printf "%T@\0%p\0" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\0'
यह आपकी समस्या को हल करने का एक तेज़ तरीका होना चाहिए यदि फ़ाइलों की संख्या काफी बड़ी है।
मैंने एनयूएल चरित्र (यानी '\ 0') का उपयोग किया है, क्योंकि, सैद्धांतिक रूप से, एक फ़ाइल नाम में कोई भी वर्ण (अंतरिक्ष और नई रेखा सहित) हो सकता है।
यदि आपके पास आपके सिस्टम में ऐसे पैथोलॉजिकल फाइलनेम नहीं हैं, तो आप न्यूलाइन वर्ण का भी उपयोग कर सकते हैं:
find . -type f -printf "%T@\n%p\n" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\n'
इसके अलावा, यह mawk में भी काम करता है।
mawk
डेबियन मानक विकल्प के साथ काम नहीं करता है ।
मुझे सोलारिस 10 के तहत अंतिम संशोधित फाइल खोजने में परेशानी हुई। इसके find
पास कोई printf
विकल्प नहीं है और stat
यह उपलब्ध नहीं है। मैंने निम्नलिखित समाधान की खोज की जो मेरे लिए अच्छा काम करता है:
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1
फ़ाइल नाम दिखाने के लिए भी उपयोग करें
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1
व्याख्या
find . -type f
सभी फ़ाइलों को ढूँढता है और सूचीबद्ध करता हैsed 's/.*/"&"/'
व्हॉट्सएप को हैंडल करने के लिए उद्धरणों में pathname लपेटता हैxargs ls -E
उद्धृत पथ को भेजता है ls
, -E
विकल्प यह सुनिश्चित करता है कि एक पूर्ण टाइमस्टैम्प (प्रारूप -वर्ष-माह-दिन-घंटा-सेकंड-नैनो-सेकंड) ) लौटा दिया गया हैawk '{ print $6," ",$7 }'
केवल तारीख और समय निकालता हैawk '{ print $6," ",$7," ",$9 }'
अर्क तिथि, समय और फ़ाइल नामsort
दिनांक के आधार पर छांटी गई फाइलों को लौटाता हैtail -1
केवल अंतिम संशोधित फ़ाइल लौटाता हैयह ठीक काम करने लगता है, यहां तक कि उपनिर्देशिका के साथ भी:
find . -type f | xargs ls -ltr | tail -n 1
बहुत अधिक फ़ाइलों के मामले में, खोज को परिष्कृत करें।
-l
विकल्प ls
। बस -tr
पर्याप्त लगता है।
find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
मानव पठनीय टाइमस्टैम्प के साथ नवीनतम फ़ाइल दिखाता है:
find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n1
परिणाम इस तरह दिखता है:
2015-10-06 11:30: +0200 ./foo/bar.txt
अधिक फ़ाइलों को दिखाने के लिए, -n1
एक उच्च संख्या के साथ बदलें
मैं हर समय कुछ इसी तरह का उपयोग करता हूं, साथ ही सबसे हाल ही में संशोधित फ़ाइलों की टॉप-के सूची भी। बड़े निर्देशिका पेड़ों के लिए, छंटाई से बचने के लिए यह बहुत तेज हो सकता है । हाल ही में संशोधित हुई सबसे शीर्ष फ़ाइल के मामले में:
find . -type f -printf '%T@ %p\n' | perl -ne '@a=split(/\s+/, $_, 2); ($t,$f)=@a if $a[0]>$t; print $f if eof()'
1.7 मिलियन फ़ाइलों वाली एक निर्देशिका पर, मुझे 3.4s में सबसे हाल ही में एक मिलता है, जो 25.5s के मुकाबले 7.5x की गति-अप का उपयोग करता है।
lastfile
) और फिर आप परिणाम के साथ जो चाहें कर सकते हैं, जैसे कि ls -l $(lastfile .)
, या open $(lastfile .)
(मैक पर), आदि
उबंटू 13 पर, निम्नलिखित इसे करता है, हो सकता है कि यह तेजी से फैलता है, क्योंकि यह क्रम को उलट देता है और 'टेल' के बजाय 'हेड' का उपयोग करता है, जिससे काम कम हो जाता है। एक पेड़ में 11 सबसे नई फाइलें दिखाने के लिए:
खोजो। -Type f -printf '% T @% p \ n' | sort -n -r | सिर -11 | cut -f2- -d "" | sed -e 's, ^। / ,,' | xargs ls -U -l
यह फिर से छँटाई के बिना एक पूर्ण एलएस लिस्टिंग देता है और कष्टप्रद '' को छोड़ देता है '' / 'कि' खोज 'हर फ़ाइल नाम पर डालता है।
या, बैश फ़ंक्शन के रूप में:
treecent () {
local numl
if [[ 0 -eq $# ]] ; then
numl=11 # Or whatever default you want.
else
numl=$1
fi
find . -type f -printf '%T@ %p\n' | sort -n -r | head -${numl} | cut -f2- -d" " | sed -e 's,^\./,,' | xargs ls -U -l
}
फिर भी, अधिकांश कार्य प्लंड्रा के मूल समाधान द्वारा किए गए थे। धन्यवाद प्लांड्रा
मैंने उसी मुद्दे का सामना किया। मुझे सबसे हाल की फ़ाइल को पुनरावर्ती रूप से खोजने की आवश्यकता है। खोजने में लगभग 50 मिनट लगे।
यहाँ यह तेजी से करने के लिए एक छोटी सी स्क्रिप्ट है:
#!/bin/sh
CURRENT_DIR='.'
zob () {
FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
if [ ! -f ${FILE} ]; then
CURRENT_DIR="${CURRENT_DIR}/${FILE}"
zob
fi
echo $FILE
exit
}
zob
यह एक पुनरावर्ती फ़ंक्शन है जो किसी निर्देशिका की सबसे हाल ही में संशोधित आइटम प्राप्त करता है। यदि यह आइटम एक निर्देशिका है, तो फ़ंक्शन को पुनरावर्ती कहा जाता है और इस निर्देशिका में खोज की जाती है, आदि।
मुझे निम्नलिखित छोटे और अधिक व्याख्यात्मक आउटपुट के साथ मिलते हैं:
find . -type f -printf '%TF %TT %p\n' | sort | tail -1
मानकीकृत आईएसओ प्रारूप डेटाटाइम्स की निश्चित लंबाई को देखते हुए, लेक्सोग्राफिक सॉर्टिंग ठीक है और हमें -n
इस प्रकार के विकल्प की आवश्यकता नहीं है ।
यदि आप टाइमस्टैम्प को फिर से हटाना चाहते हैं, तो आप उपयोग कर सकते हैं:
find . -type f -printf '%TFT%TT %p\n' | sort | tail -1 | cut -f2- -d' '
यदि stat
प्रत्येक फ़ाइल को व्यक्तिगत रूप से चलाना धीमा करना है तो आप xargs
चीजों को थोड़ा गति देने के लिए उपयोग कर सकते हैं :
find . -type f -print0 | xargs -0 stat -f "%m %N" | sort -n | tail -1 | cut -f2- -d" "
यह वर्तमान निर्देशिका में सभी निर्देशिकाओं के संशोधन समय को प्रत्येक निर्देशिका में नवीनतम फ़ाइल में बदलता है:
for dir in */; do find $dir -type f -printf '%T@ "%p"\n' | sort -n | tail -1 | cut -f2- -d" " | xargs -I {} touch -r {} $dir; done
यह सरल क्ली भी काम करेगा:
ls -1t | head -1
आप जिन फ़ाइलों को सूचीबद्ध करना चाहते हैं, उनकी संख्या -1 को बदल सकते हैं
मुझे कमांड ऊपर उपयोगी लगी, लेकिन मेरे मामले के लिए मुझे फ़ाइल की तारीख और समय देखने की आवश्यकता थी और साथ ही मुझे कई फाइलों के साथ एक समस्या थी जिनके नाम में स्थान हैं। यहाँ मेरा काम कर समाधान है।
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | sed 's/.*/"&"/' | xargs ls -l
$ 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
लिंक के बाद और अधिक शानदार।
/ Target_directory और इसके सभी उप-निर्देशिकाओं में फ़ाइलों की खोज करने के लिए, जिन्हें पिछले 60 मिनट में संशोधित किया गया है:
$ find /target_directory -type f -mmin -60
सबसे हाल ही में संशोधित फ़ाइलों को खोजने के लिए, अद्यतन समय के रिवर्स क्रम में क्रमबद्ध (यानी, सबसे हाल ही में अद्यतन की गई फ़ाइलें):
$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
मुझे यह पसंद है, यह छोटा है:
find . -type f -print0|xargs -0 ls -drt|tail -n 1
मैंने इस प्रश्न के लिए एक pypi / github पैकेज लिखा क्योंकि मुझे इसके समाधान की आवश्यकता थी।
https://github.com/bucknerns/logtail
इंस्टॉल:
pip install logtail
उपयोग: पूंछ बदल फ़ाइलें
logtail <log dir> [<glob match: default=*.log>]
उपयोग 2: संपादक में नवीनतम परिवर्तित फ़ाइल खोलता है
editlatest <log dir> [<glob match: default=*.log>]