पिछले संशोधित तिथि के आधार पर निर्देशिका में फ़ाइलों को पुनरावर्ती रूप से सॉर्ट करें


11

पिछले संशोधित तिथि के आधार पर निर्देशिका में फ़ाइलों को पुनरावर्ती रूप से सॉर्ट करें

मैंने अपनी निर्देशिका में बहुत सारी फाइलें संशोधित की हैं, यह जानना चाहता हूं कि अंतिम संशोधित तिथि के अनुसार उन्हें छांटकर कौन सी फाइलें हैं और इसमें मैं चाहता हूं कि कुछ एक्सटेंशनों को बाहर कर दिया जाए।

svn निर्देशिका में मेरे पास बहुत सारी .svn फाइलें हैं, जिन्हें मैं इस प्रकार दिखाना नहीं चाहता


मैंने अपने उत्तर में विस्तार को बाहर करने का डेमो किया।
मोकेसर

जवाबों:


18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

आपको ऐसा कुछ देगा

2014-03-31 04: 10: 54.8596422640 ।/foo
2014-04-01 01: 02: 11.9635521720//।


क्या मैं फ़ोल्डर से फ़ाइल एक्सटेंशन को बाहर कर सकता हूं ....
डैनी

@ डैनी हां, यह ढूंढना आसान है find -not -iname '*.ext':।
n.st

Find -not -path " svn " -not -name "* svn" -printf "% TY-% Tm-% Td-% Td% TT% p \ n" | सॉर्ट-एन यह वही है जिसकी मुझे बहुत ज़रूरत है धन्यवाद @ n.st
डैनी

5

यदि आप निर्देशिका संरचना को समतल करना चाहते हैं (इस प्रकार सभी निर्देशिकाओं में सभी फाइलों पर तारीख के अनुसार छंटनी कर रहे हैं, तो कौन सी निर्देशिका को अनदेखा कर रहे हैं) find-yroi द्वारा सुझाए गए -approach जाने का रास्ता है। यदि आप निर्देशिका संरचना को संरक्षित करना चाहते हैं, तो आप कोशिश कर सकते हैं

$ ls -ltR /path/to/directory

कौन सी निर्देशिका आधारित है।


1
यह मुझे फ़ोल्डर में समझदार बना देता है जहाँ मुझे जो चाहिए वह सब एक साथ है जो हाल ही में संशोधित फाइलें हैं
डैनी

5

बैश में, shopt -s globstarपहले दौड़ें । Ksh93 में, set -o globstarपहले दौड़ें । Zsh में, आप पहले से ही सेट हैं।

ls -dltr **/*

यदि आपके पास इतनी फाइलें हैं कि आपके सिस्टम पर कमांड लाइन की लंबाई सीमा पार हो गई है तो यह एक त्रुटि लौटाएगा। Zsh में, आप इसके बजाय इसका उपयोग कर सकते हैं:

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

यहाँ केवल यही एक उत्तर है जो Solaris 10 के लिए काम करता है, धन्यवाद! :)
laxxy

3

मान लें कि आप GNU खोज रहे हैं, कोशिश करें:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

1
आप इस्तेमाल कर सकते हैं findके -printfविकल्प के लिए एक अलग प्रक्रिया लागू (या कई, फ़ाइलों की संख्या पर निर्भर करता है) से बचने के लिए। एक उदाहरण के लिए मेरा जवाब देखें ।
23

1
यह जानते हुए कि वहाँ यह करने के लिए अन्य तरीके हैं कि, मैं चाहता था देने के लिए statएक मौका और शो -exec ... +। वास्तव में! कभी-कभी मुझे लगता है, statअधिक ध्यान देने योग्य है ... और किसी को भी सामग्री के बारे में पढ़ने और परिणामों के बारे में सोचने के बिना यहां से व्यंजनों को लेना चाहिए ...

Btw ... हर खोज में नहीं -printf...

1
@yeti - यदि आपके findपास नहीं है -printf, तो आप -exec sh -c 'printf...'एक ही कार्यक्षमता को प्राप्त करने के लिए उपयोग कर सकते हैं । इसमें $(pwd)पूरी तरह से योग्य पथों के लिए उपयोग शामिल होगा ।
mikeserv

2
मैं बहुत सारे linux उपयोगकर्ताओं से मिला जिनके बारे में कभी नहीं पढ़ा stat। इसलिए कभी-कभी मैं सिर्फ कुछ ध्यान देना चाहता statहूं ... मुझे लगता है statकि वह इसके हकदार हैं ...

2

केवल हाल ही में GNU टूल का उपयोग करके फाइलनामों को मजबूती से सूचीबद्ध करने के लिए:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'

2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

यह किसी भी तर्क सूची की समस्याओं से बचा जाता है क्योंकि एकमात्र तर्क जो lsकभी भी प्राप्त होगा वह उस निर्देशिका का नाम है जिसे आप सूचीबद्ध करना चाहते हैं। आप अपनी मर्जी से ऐसा कुछ भी कर सकते हैं।

शेल सिर्फ शेल स्क्रिप्ट . sourcesके |pipeरूप में - यह एक ही प्रक्रिया है और आपके पास समस्याएँ नहीं हैं जिन्हें आप execveकॉल कर सकते हैं ।

किसी भी मामले में - उपरोक्त केवल तीन-गहरा होता है जो कि बदलकर समायोज्य होता है maxdepth यह पहले भी गहरा है - इसलिए आप अपनी वर्तमान निर्देशिका से अपने तरीके से पीछे की ओर काम करते हैं depth

आप देख सकते हैं कि आपको भी $LSCOLORS- मेरी मशीन पर यह बड़े करीने से मुद्रित कॉलम और बाकी सब चीजें जो आप चाहते हैं ls- या उस चीज के लिए, जो कुछ भी आप कल्पना कर सकते हैं कि आप चाहते हैं, प्रदान करता है. source.

सं SVN

फिर, यह कुछ भी आप की उम्मीद करेंगे lsइसलिए .svnफाइल को छुपाना उतना ही सरल है जितना कि lsलाइन को बदलना :

ls -t --color=always --hide="*svn" "%p"\n

या यदि आप svnप्रत्येक फ़ोल्डर में एक्सटेंशन देखना चाहते हैं, लेकिन ./svnआप इसे बदल सकते हैं तो पूरा कमांड इस तरह दिखता है:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

निजी तौर पर, मुझे यह पसंद है कि -sअगर आप देखभाल करते हैं, तो आप -umod time के बजाय एक्सेस टाइम के अनुसार सॉर्ट करेंगे।


1

यह एक सभी सूची जाएगा files में <dir>सर्वोच्च जा रहा है के साथ सबसे पुराने संशोधित

find <dir> -type f -print0 | xargs -0 ls -ltr

और इसके साथ नवीनतम संशोधित सबसे ऊपर है

find <dir> -type f -print0 | xargs -0 ls -lt

ध्यान दें कि यह केवल तभी काम करता है जब फ़ाइल नामों की सूची आपके सिस्टम पर कुल कमांड लाइन की लंबाई सीमा से अधिक न हो।


सच है, मैं उस के बारे में भूल गया
UnX

कमांड के बारे में संदर्भ के लिए : arg list बहुत लंबी- in.mm.de/~mascheck/various/argmax
UnX

@ गिल्स: आपका मतलब xargs -0(दोनों मामलों में) है।  xargs -print0के बराबर है xargs -p -r -i -n -t -0या xargs -inprt0या xargs -0ntripजो शायद नहीं है तुम क्या मतलब,।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.