नवीनतम निर्देशिका प्राप्त करें (नवीनतम फ़ाइल नहीं)


15

मेरे फ़ोल्डर parentमें निम्न सामग्री है:

A.Folder B.Folder C.File

इसके अंदर फोल्डर और फाइल दोनों हैं। B.Folderनया है। अब मैं बस प्राप्त करना चाहता हूं B.Folder, मैं इसे कैसे प्राप्त कर सकता हूं? मैंने यह कोशिश की,

ls -ltr ./parent | grep '^d' | tail -1

लेकिन यह मुझे देता है drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, लेकिन मुझे सिर्फ नाम की जरूरत है B.Folder


1
इसका उपयोग करेंls -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بار

अजीब कार्यों का उपयोग करना, लेकिन मैं देखना चाहता हूं कि क्या कोई क्लीनर समाधान है। :)
डैनियल

खोजो। -Maxdepth 1 -टाइप d | TZ = utc xargs ls -ld --full-time | sort -k 6
ctrl-alt-delor-

जवाबों:


24

इसे इस्तेमाल करे:

$ ls -td -- */ | head -n 1

-tविकल्प lsसंशोधन समय के अनुसार क्रमबद्ध करते हैं , सबसे पहले नया।

यदि आप हटाना चाहते हैं /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

1
स्लैश से कैसे छुटकारा पाएं /?
डेनियल

यदि आप किसी अन्य फ़ोल्डर में हैं, तो यह काम नहीं करता है। मेरा मतलब ls -td -- ./parent | head -n 1है कि मुझे सही परिणाम नहीं दिए गए हैं, क्या मुझे cd ./parentहर बार इस तरह से उप-धारा का उपयोग करना और इस आदेश को निष्पादित करना है? कोई भी समाधान?
डैनियल

@ डैनियल: आपको काम करने के लिए अपना जवाब मौजूदा वर्किंग डायरेक्टरी में चलाना होगा। अन्यथा, आपको हर्सन के उत्तर की तरह एक सापेक्ष पथ का उपयोग करना चाहिए।
कोउन्ग्लम

अंतिम हटाने / काम नहीं करता है। उदाहरण: / होम / क्यूओ / बिन / उम्मीद: / घर / क्यूओ / बिन
मैरीस

5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

हर्सन के समाधान के बाद अंतर स्लैश है *, जो शेल को सभी गैर-डीआईआर फ़ाइलों को अनदेखा करता है। Gnouc में अंतर , यदि आप किसी अन्य फ़ोल्डर में हैं तो यह काम करेगा।

कट '/' को हटाने के लिए मूल निर्देशिका (2) की संख्या जानने की जरूरत है। यदि आपके पास ऐसा नहीं है, तो उपयोग करें

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"

3

अप्रत्यक्ष zsh उत्तर:

latest_directory=(parent/*(/om[1]))

कोष्ठक में पात्र ग्लोब क्वालिफायर हैं : /केवल निर्देशिकाओं का मिलान करने के लिए, omबढ़ती उम्र के अनुसार मैच को सॉर्ट करने के लिए, और [1]केवल पहले (यानी नवीनतम) मैच को बनाए रखने के लिए। जोड़ें Nआप एक खाली सरणी प्राप्त करना चाहते हैं, तो (सामान्य रूप से आप एक 1-elementy सरणी मिल) का कोई उपनिर्देशिका है तो parent

वैकल्पिक रूप से, यह मानते हुए कि parentकोई भी गोलाकार पात्र नहीं है:

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

यदि आपके पास zsh नहीं है, लेकिन आपके पास हाल ही में GNU टूल (यानी गैर-एम्बेडेड लिनक्स या सिग्विन) हैं, तो आप उपयोग कर सकते हैं find, लेकिन यह बोझिल है। यहाँ एक तरीका है:

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

इसके साथ एक सरल उपाय है ls, जो तब तक काम करता है जब तक कि कोई निर्देशिका नाम में newlines या (कुछ सिस्टम पर) गैर-मुद्रण योग्य वर्ण शामिल न हों:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}


2

स्पेस वाले डायरेक्टरी नाम के मामले में भी निम्नलिखित कमांड काम करेगा:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

Backticks में सामान की अद्यतन व्याख्या है:

  • . - वर्तमान निर्देशिका (आप यहां एक पूर्ण पथ निर्दिष्ट करना चाह सकते हैं)
  • -mindepth/-maxdepth - केवल वर्तमान निर्देशिका के तत्काल बच्चों के लिए खोज आदेश को प्रतिबंधित करें
  • -type d - केवल निर्देशिका
  • -exec stat .. - संशोधित समय और निर्देशिका के नाम को टैब से अलग करके खोजें (और स्थान नहीं)
  • sort -n -r |head -1 | cut -f2 - तिथि निर्देशिका का आदेश देती है और हाल ही में संशोधित किए गए पूरे नाम को आउटपुट करती है (भले ही कटौती डिफ़ॉल्ट सीमांकक टैब के रूप में कुछ स्थान युक्त हो)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.