लिनक्स पर एक निर्देशिका में सबसे हाल की फ़ाइल प्राप्त करें


183

एक कमांड की तलाश है जो एक निर्देशिका में सबसे हाल की फ़ाइल लौटाएगा।

एक सीमा पैरामीटर नहीं देख रहा है ls...


1
watch -n1 'ls -Art | tail -n 1'- बहुत ही अंतिम फाइलों को दिखाता है

यहां अधिकांश उत्तर उन आउटपुट lsया पार्स का उपयोग करते हैं जिनके findबिना -print0कष्टप्रद फ़ाइल-नामों से निपटने के लिए समस्याग्रस्त है। हमेशा उल्लेख करने के लिए उपयोगी: BashFAQ099 जो इस समस्या का POSIX उत्तर देता है
kavourour

जवाबों:


266
ls -Art | tail -n 1

बहुत सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है।


2
ls -Artls का उपयोग करके आप फ़ाइल की तारीख भी देख सकते हैं।
जोस

13
एक मामूली समस्या: इस संस्करण के सभी आउटपुट को पाइप करता lsहै tail, फिर केवल LAST लाइन को प्रिंट करता है। IMHO बेहतर है कि आरोही क्रम में छाँटें और headइसके बजाय उपयोग करें , जैसा कि chaosसुझाव दिया गया है। पहली पंक्ति के हेड क्विट्स को प्रिंट करने के बाद, इसलिए अगली लाइन (वास्तव में अगला ब्लॉक) भेजना एक SIGPIPE को बढ़ाएगा और lsसाथ ही छोड़ देगा।
ट्रू वाई

1
@ मुझे लगता है मैं काफी सहमत हूँ। दक्षता के लिए अराजकता का जवाब बेहतर है।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

2
ध्यान दें कि इस समाधान में निर्देशिकाओं के साथ-साथ फाइलें भी शामिल हैं। यह अच्छी बात या बुरी बात हो सकती है; यह व्यक्तिगत उपयोगकर्ता क्या चाहता है पर निर्भर करता है। मैं इसे लाने का कारण यह है कि मूल प्रश्न "फ़ाइल" कहता है।
सिल्डोरेथ

2
मुझे लगता है कि सिर के बजाय पूंछ का उपयोग करने का इरादा लाभ एलएस द्वारा लौटाए गए कुल का वर्णन करते हुए लाइन के शामिल किए जाने को बाहर करना हो सकता है।
पीटर स्कॉट

155
ls -t | head -n1

यह कमांड वास्तव में वर्तमान कार्यशील निर्देशिका में नवीनतम संशोधित फाइल देता है।


मेरे बराबर, और संभवतः अधिक कुशल, भी।
dmckee --- पूर्व-संचालक ने

मेरे लिए काफी काम नहीं करता है क्योंकि मैं अपने एलएस में कुछ जानकारी पहले गूंजता हूं, लेकिन मुझे इसका उपयोग मिलता है, धन्यवाद!
एक

4
@ जोसर इसमें डेटस्टैम्प को शामिल करने के लिए संशोधित किया जा सकता है ls -tl | head -n 1, और यह पाइप के माध्यम से पूरी मेज को धक्का नहीं देता है जिस तरह से मेरा काम करता है।
dmckee --- पूर्व-मध्यस्थ बिल्ली का बच्चा

1
@ no @z 14:ls -t *.png | head -n1
अराजकता

4
यदि यह नवीनतम संशोधित है, तो यह एक फ़ोल्डर देता है, उपयोग करें: ls -Art | head -n1यदि आप विशेष रूप से नवीनतम संशोधित फ़ाइल चाहते हैं
achasinh

79

यह एक पुनरावर्ती संस्करण है (अर्थात यह एक निश्चित निर्देशिका या इसके किसी उपनिर्देशिका में सबसे हाल ही में अद्यतन की गई फ़ाइल पाता है)

find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1

संपादित करें: उपयोग -f 2-के बजाय -f 2के रूप में केविन ने सुझाव दिया


5
यहाँ मैक के लिए एक समाधान है:find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
उपयोगकर्ता

2
समस्या कट-कमांड 2 के बजाय रिक्त स्थान के साथ पथों को काट-छाँट करने के लिए है -f2- लाइन के अंत में फ़ील्ड 2 को वापस करने के लिए
केविन

2
जैसा कि अराजकता द्वारा सुझाव दिया गया है, यदि आप का उपयोग करके सॉर्ट को उल्टा करते हैं, तो आप इसके बजाय sort -nrउपयोग कर सकते हैं और दक्षता में थोड़ा सुधार कर सकते हैं। (यद्यपि यदि आप एक पुनरावर्ती खोज को head -n 1tail -n 1
हल

2
बहुत उपयोगी! मुझे यह और अधिक अनुकूल लगता है अगर ls को पाइप किया जाए तो:find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
साइमन

@ उपयोगकर्ता का मैक संस्करण केवल दिनांक, समय प्रदर्शित करता है। यहाँ एक निश्चित संस्करण है:find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
yoz

11

विश्वसनीयता के बारे में एक नोट:

चूंकि न्यूलाइन वर्ण फ़ाइल नाम में किसी भी तरह मान्य है, कोई भी समाधान जो / आधारित लोगों की तरह लाइनों पर निर्भर है, त्रुटिपूर्ण हैं।headtail

GNU के साथ ls, --quoting-style=shell-alwaysविकल्प और bashसरणी का उपयोग करने के लिए एक और विकल्प है :

eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"

( यदि आप छिपी हुई फाइलों पर भी विचार करना चाहते हैं तो -Aविकल्प जोड़ें ls)।

यदि आप नियमित फाइलों (डिसॉर्डर्ड डाइरेक्टरीज़, फ़ोरोस, डिवाइसेस, सिमिलिंक, सॉकेट ...) को सीमित करना चाहते हैं, तो आपको GNU का सहारा लेना होगा find

बश 4.4 या नए (के लिए readarray -d) और GNU कोर्यूटिल्स 8.25 या नए (के लिए cut -z) के साथ:

readarray -t -d '' files < <(
  LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
  sort -rzn | cut -zd/ -f2)

((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"

या पुनरावर्ती:

readarray -t -d '' files < <(
  LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
  sort -rzn | cut -zd/ -f2-)

सबसे अच्छा है कि इस परेशानी से बचने zshके bashलिए इसका उपयोग और इसके शानदार क्वालिफायर का उपयोग किया जाए :

वर्तमान निर्देशिका में नवीनतम नियमित फ़ाइल:

printf '%s\n' *(.om[1])

छिपे हुए सहित:

printf '%s\n' *(D.om[1])

दूसरा सबसे नया:

printf '%s\n' *(.om[2])

सिमलिंक रिज़ॉल्यूशन के बाद फ़ाइल की आयु जांचें:

printf '%s\n' *(-.om[1])

रिकर्सिवली:

printf '%s\n' **/*(.om[1])

इसके अलावा, पूर्ण होने वाली प्रणाली ( compinitऔर सह) सक्षम होने के साथ , Ctrl+Xmएक कंपाइलर बन जाता है जो नवीनतम फ़ाइल में फैलता है।

इसलिए:

vi Ctrl+Xm

क्या आप नवीनतम फ़ाइल को संपादित करेंगे (आपको प्रेस करने से पहले यह देखने का भी मौका मिलेगा Return)।

vi Alt+2Ctrl+Xm

दूसरी-नई फ़ाइल के लिए।

vi * .सीCtrl+Xm

नवीनतम cफ़ाइल के लिए।

vi * (?)Ctrl+Xm

नवीनतम नियमित फ़ाइल के लिए (निर्देशिका नहीं, और न ही फिफो / डिवाइस ...), और इसी तरह।


zshसुझावों के लिए धन्यवाद । क्या आप zsh डॉक्स में इस बारे में अधिक जानकारी के लिए लिंक प्रदान कर सकते हैं?
फ्रीज

@ मुक्त, देखेंinfo zsh qualifiers
स्टीफन चेजेलस

धन्यवाद @Stephane Chazelas
freezed

9

मैं उपयोग करता हूं:

ls -ABrt1 --group-directories-first | tail -n1

यह मुझे केवल फ़ाइल नाम देता है, फ़ोल्डर्स को छोड़कर।


जब तक एक निर्देशिका में केवल निर्देशिका नहीं होती
ealfonso

8

ls -lAtr | tail -1

अन्य समाधानों में वे फाइलें शामिल नहीं हैं जो इसके साथ शुरू होती हैं '.'

इस आदेश में यह भी शामिल होगा '.'और '..', जो आप चाहते हैं या नहीं हो सकता है:

ls -latr | tail -1


क्या यह वापस आएगा "।" यदि निर्देशिका को हाल ही में किसी भी फ़ाइल की तुलना में अधिक संशोधित किया गया है (एक विलोपन द्वारा कहें)? शायद यही वांछित व्यवहार है, शायद नहीं। लेकिन तुम दोनों ही तरह सही हो।
dmckee --- पूर्व-संचालक ने


5

मुझे पसंद है echo *(om[1])( zshसिंटैक्स) जैसा कि सिर्फ फ़ाइल का नाम देता है और किसी अन्य कमांड को इनवोक नहीं करता है।


1
यदि आप zsh का उपयोग कर रहे हैं तो ठीक काम करता है। क्या आप zsh का उपयोग नहीं कर रहे हैं? मुझे लगता है कि उबंटू में बैश डिफ़ॉल्ट है; आप zsh स्थापित कर सकते हैं, या आप bash के लिए एक समान कमांड पा सकते हैं।
माइकबी

3
कमांड "इको" है; यह सिर्फ अपने मापदंडों का मूल्यांकन करता है और उन्हें मानक आउटपुट में भेजता है। इस मामले में, ग्लोब क्वालिफायर "ओम [1]" में "ओ" है, जिसका अर्थ है कि "एम" द्वारा मिलान की गई फ़ाइलों को ऑर्डर करें, जो कि संशोधित समय है। और उस आदेशित सूची में से, [1] लें, जो कि पहली फ़ाइल है। आप ग्लोब क्वालिफायर के बारे में पढ़ सकते हैं: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Qualifiers
माइक सेप

4

फाइंड / सॉर्ट सॉल्यूशन तब तक बढ़िया काम करता है जब तक कि फाइलों की संख्या वास्तव में बड़ी न हो जाए (जैसे कि पूरी फाइल सिस्टम)। केवल सबसे हाल की फ़ाइल पर नज़र रखने के बजाय awk का उपयोग करें:

find $DIR -type f -printf "%T@ %p\n" | 
awk '
BEGIN { recent = 0; file = "" }
{
if ($1 > recent)
   {
   recent = $1;
   file = $0;
   }
}
END { print file; }' |
sed 's/^[0-9]*\.[0-9]* //'

3

मैं व्यक्तिगत रूप से कम-से-कम निर्मित bashकमांड का उपयोग करना पसंद करता हूं जैसा कि मैं कर सकता हूं (महंगे कांटे को कम करने और syscalls को निष्पादित करने के लिए)। तिथि के अनुसार क्रमबद्ध करने के लिए lsआवश्यक कहा जाता है। लेकिन headवास्तव में आवश्यक नहीं है। मैं निम्नलिखित एक-लाइनर का उपयोग करता हूं (केवल नाम के पाइप का समर्थन करने वाले सिस्टम पर काम करता है):

read newest < <(ls -t *.log)

या सबसे पुरानी फ़ाइल का नाम पाने के लिए

read oldest < <(ls -rt *.log)

(दो '<' चिह्नों के बीच के स्थान को ध्यान में रखें!)

अगर छिपी हुई फ़ाइलों की भी जरूरत है-एक arg जोड़ा जा सकता है।

मुझे उम्मीद है कि इससे मदद मिल सकती है।


आपको यह समझाना चाहिए कि फ़ाइल नाम को $ पुराने / नवीनतम संस्करण में संग्रहीत किया गया है। लेकिन कम से कम कांटे के लिए +1।
स्क्वरटॉम

@squareatom मुझे लगा कि पढ़ा लिखा काफी अच्छी तरह से बनाया गया है। लेकिन आप सही हैं, शायद नहीं। आपके कमेंट के लिए धन्यवाद!
ट्रू

3
यदि आप जानते हैं कि अंतर्निहित क्या है, तो आप सही हैं। लेकिन, मैं सिर्फ ओपी के सवाल के बारे में सोच रहा था। उन्होंने आज्ञा मांगी कि कुछ लौटाओगे। तकनीकी रूप से आपका समाधान कुछ भी आउटपुट नहीं करता है। तो बस अंत तक "&& प्रतिध्वनि $ नया जोड़ें" या इसी तरह ;-)
स्क्वैरटॉम

3

आर पुनरावर्ती विकल्प का उपयोग करना .. आप इसे यहाँ अच्छे उत्तरों के लिए वृद्धि के रूप में मान सकते हैं

ls -arRtlh | tail -50

2
ls -t -1 | sed '1q'

फ़ोल्डर में अंतिम संशोधित आइटम दिखाएगा। grepकीवर्ड के साथ नवीनतम प्रविष्टियों को खोजने के लिए जोड़ी

ls -t -1 | grep foo | sed '1q'

'1q' क्या है? 1पहली पंक्ति के लिए समान है head -n 1कि q क्या है?
HattrickNZ

2

रिकर्सिवली:

find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head

1

इस सरल आदेश का प्रयास करें

ls -ltq  <path>  | head -n 1

यदि आप फ़ाइल नाम चाहते हैं - अंतिम संशोधित, पथ = /ab/cd/*.log

यदि आप निर्देशिका नाम चाहते हैं - अंतिम संशोधित, पथ = / ab / cd / * /


1

मान लें कि आप छिपी हुई फ़ाइलों के बारे में परवाह नहीं करते हैं जो एक के साथ शुरू होती हैं .

ls -rt | tail -n 1

अन्यथा

ls -Art | tail -n 1


0

उन सभी ls / टेल समाधान a में फ़ाइलों के लिए पूरी तरह से ठीक काम करते हैं निर्देशिका - उपनिर्देशिका अनदेखी।

अपनी खोज में सभी फ़ाइलों को शामिल करने के लिए (पुनरावर्ती), खोज का उपयोग किया जा सकता है। gioele ने सुझाव दिया कि स्वरूपित खोज आउटपुट को क्रमबद्ध किया जाए। लेकिन व्हाट्सएप से सावधान रहें (उनका सुझाव व्हॉट्सऐप के साथ काम नहीं करता है)।

यह सभी फ़ाइल नामों के साथ काम करना चाहिए:

find $DIR -type f -printf "%T@ %p\n" | sort -n | sed -r 's/^[0-9.]+\s+//' | tail -n 1 | xargs -I{} ls -l "{}"

इस प्रकार के समय के अनुसार, मनुष्य को देखें:

%Ak    File's  last  access  time in the format specified by k, which is either `@' or a directive for the C `strftime' function.  The possible values for k are listed below; some of them might not be available on all systems, due to differences in `strftime' between systems.
       @      seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.
%Ck    File's last status change time in the format specified by k, which is the same as for %A.
%Tk    File's last modification time in the format specified by k, which is the same as for %A.

तो बस समय के अनुसार बदलने %Tके %Cलिए।


आप @gioele सुझाव के साथ सफेद स्थान समस्या के बारे में सही कर रहे हैं, लेकिन आप केवल यह है कि यह ठीक करने के लिए एक सीमा बनाने के लिए -f विकल्प के लिए एक हाइफन जोड़ने की जरूरत है: find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1 या वैकल्पिक रूप से, पहले क्षेत्र को छोड़कर सभी का ध्यान रखें: find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
हारून

0

एक पैटर्न के अनुसार हर निर्देशिका में सबसे वर्तमान फ़ाइल ढूंढना, उदाहरण के लिए "tmp" (केस असंवेदनशील) के साथ समाप्त होने वाले कार्य निर्देशिका की उप निर्देशिकाएं:

find . -iname \*tmp -type d -exec sh -c "ls -lArt {} | tail -n 1" \;

0
ls -Frt | grep "[^/]$" | tail -n 1

1
अन्य उत्तर हैं जो ओपी के प्रश्न प्रदान करते हैं, और वे कई साल पहले पोस्ट किए गए थे। उत्तर पोस्ट करते समय, कृपया सुनिश्चित करें कि आप या तो एक नया समाधान जोड़ते हैं, या काफी बेहतर व्याख्या करते हैं, खासकर पुराने प्रश्नों का उत्तर देते समय।
help-info.de 17:15 बजे

2
@ help-info.de कृपया उन उत्तरों को हटाने के लिए मतदान न करें जो केवल-कोड हैं। वे महान नहीं हो सकते हैं, लेकिन विलोपन उन चीजों के लिए है जो उत्तर नहीं हैं
मचविती

@ माचविटी - मुझे उम्मीद है कि असफल नहीं हुआ और केवल देर से जवाब के लिए एक टिप्पणी की।
help-info.de

0

यदि आप किसी भी उपनिर्देशिका सहित सबसे हाल ही में बदली गई फ़ाइल प्राप्त करना चाहते हैं, तो आप इसे इस छोटे से ऑनलाइनर के साथ कर सकते हैं:

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done

यदि आप परिवर्तित फ़ाइलों के लिए ही नहीं करना चाहते हैं, लेकिन एक्सेस की गई फ़ाइलों के लिए आपको सरल को बदलना होगा

% Y से पैरामीटर स्टेट को आदेश % एक्स । और हाल ही में एक्सेस की गई फ़ाइलों के लिए आपका कमांड इस तरह दिखता है:

find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done

यदि आप केवल एक फ़ाइल से अधिक सूची बनाना चाहते हैं, तो दोनों कमांड के लिए आप var = "1" पैरामीटर भी बदल सकते हैं ।


-1

मुझे इसे करने की ज़रूरत थी, और मुझे ये आज्ञाएँ मिलीं। मेरे लिए ये काम:

यदि आप फ़ोल्डर (पहुंच समय) में निर्माण की तारीख तक अंतिम फ़ाइल चाहते हैं:

ls -Aru | tail -n 1  

और यदि आप अंतिम फ़ाइल चाहते हैं जिसमें इसकी सामग्री में परिवर्तन हो (समय संशोधित करें):

ls -Art | tail -n 1  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.