सवाल यूनिक्स / लिनक्स दिनांक संशोधित तिथि के अनुसार ढूंढें और क्रमबद्ध करें


मैं एक सरल कैसे कर सकता हूँ find जो हाल ही में संशोधित परिणामों के परिणाम देगा?

वर्तमान यहाँ है find मैं उपयोग कर रहा हूं (मैं PHP में खोल खोल रहा हूं, इसलिए चर के लिए तर्क है):

find '$dir' -name '$str'\* -print | head -10

हाल ही में संशोधित द्वारा मुझे यह आदेश कैसे खोज सकता है? (ध्यान दें कि मैं इसे खोज के बाद 'सॉर्ट करना नहीं चाहता हूं, बल्कि हाल ही में संशोधित किए गए परिणामों के आधार पर परिणाम ढूंढें।)


108
2018-06-07 18:23


मूल


github.com/shadkam/recentmost जो वांछित है वह करेगा - लेकिन इसे बनाने की जरूरत है - user3392225


जवाब:


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

find . -printf "%T@ %Tc %p\n" | sort -n

printf से तर्क man find:

  • %Tk: फ़ाइल द्वारा अंतिम प्रारूप में निर्दिष्ट प्रारूप में समय k

  • @: जनवरी 1, 1 9 70, 00:00 जीएमटी के बाद से अंशकालिक भाग के साथ सेकंड।

  • c: लोकेल की तिथि और समय (शनि नवम्बर 04 12:02:33 ईएसटी 1 9 8 9)।

  • %p: फ़ाइल का नाम।


109
2018-02-05 13:31



+1 बहुत उपयोगी, इसका पहला जवाब मैंने एक पठनीय / उपयोगी दिनांक आउटपुट के साथ पाया है - Jake N
सबसे भरोसेमंद (और बहुत सरल) क्योंकि समय को संख्यात्मक अनुक्रमिक (इसलिए हमेशा सही ढंग से क्रमबद्ध करने के लिए) दिया जाता है, thx! - Aquarius Power
मेरे पास हालिया फाइलें खोजने के लिए यह उपनाम है ~/.zshrc: fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; } यह पुनरावर्ती रूप से आदेश में पारित पहले तर्क के पैटर्न वाली सभी फाइलें पाता है (fr <pattern>) और उन्हें सबसे हालिया एक आखिरी के साथ टाइप करता है। - joelostblom
के लिये आईएसओ 8601 तारीख आउटपुट, उपयोग करें find . -printf "%T@ %CY-%Cm-%CdT%CH:%CM:%CS %p\n" | sort -n। जैसे-जैसे यह स्वाभाविक रूप से होता है, इसका उपयोग सीधे इस प्रकार भी किया जा सकता है: find . -printf "%CY-%Cm-%CdT%CH:%CM:%CS %p\n" | sort -n - Peter Mortensen


Zsh का उपयोग करने का सबसे आसान तरीका है, इसके लिए धन्यवाद ग्लोब क्वालीफायर

print -lr -- $dir/**/$str*(om[1,10])

यदि आपके पास जीएनयू मिल गया है, तो इसे फ़ाइल संशोधन समय प्रिंट करें और उसके द्वारा क्रमबद्ध करें।

find -type f -printf '%T@ %p\0' |
sort -zk 1nr |
sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10

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

find -type f -printf '%T@ %p\n' |
sort -k 1nr |
sed 's/^[^ ]* //' | head -n 10

यदि आपके पास पर्ल है (यहां मुझे लगता है कि फ़ाइल नामों में कोई नई लाइनें नहीं हैं):

find . -type f -print |
perl -l -ne '
    $_{$_} = -M;  # store file age (mtime - now)
    END {
        $,="\n";
        @sorted = sort {$_{$a} <=> $_{$b}} keys %_;  # sort by increasing age
        print @sorted[0..9];
    }'

यदि आपके पास पाइथन है (फ़ाइल नामों में कोई नई पंक्तियां भी नहीं मानती हैं):

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], reverse=True))[:10]: print f'

PHP में ऐसा करने का शायद एक तरीका है, लेकिन मुझे यह नहीं पता।

यदि आप केवल POSIX उपकरण के साथ काम करना चाहते हैं, तो यह अधिक जटिल है; देख संशोधन तिथि द्वारा क्रमबद्ध फ़ाइलों को दोबारा सूचीबद्ध करने के लिए कैसे करें (कोई स्टेट कमांड उपलब्ध नहीं है!) (पहले 10 को रीटेट करना आसान हिस्सा है)।


80
2018-06-07 18:39



मुझे लगता है find संस्करण सबसे पुरानी फाइलें दिखाता है, और आपको इसे जोड़ने की आवश्यकता है -r विकल्प sort। - Quentin Pradet
मेरे sed कहते हैं कि यह एक -z विकल्प नहीं है। - Kef Schecter
@KefSchecter फिर विभाजक के रूप में न्यूलाइन का उपयोग करें, लेकिन आप फाइल नामों में न्यूलाइन के लिए समर्थन खो देंगे। - Gilles
उपरोक्त पायथन 2 के लिए है। यदि आपके पास केवल Python3 है, तो कुछ छोटे बदलाव: python3 -c 'आयात os, sys; sys.stdin.readlines () में f के लिए times = {}: f = f [0: -1]; बार [एफ] = os.stat (एफ) .st_mtime f में (क्रमबद्ध (times.keys (), key = lambda f: times [f], reverse = True)) [: 10]: प्रिंट (एफ); ' - Neil McGill


आपको सिर्फ PHP या पायथन की आवश्यकता नहीं है ls:

man ls:
-t     sort by modification time
-r,    reverse order while sorting (--reverse )
-1     list one file per line

find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;

यदि आदेश * विफलता स्थिति से बाहर निकलता है (यानी तर्क सूची बहुत लंबी है), तो आप खोजने के साथ पुनरावृत्त कर सकते हैं। से पारदर्शी: एक नई प्रक्रिया के लिए तर्क की अधिकतम लंबाई

  • find . -print0|xargs -0 command      (गति को अनुकूलित करता है, अगर खोज "-exec +" को लागू नहीं करता है लेकिन "-print0" जानता है)
  • find . -print|xargs command     (यदि तर्कों में कोई सफेद जगह नहीं है)

यदि तर्कों के प्रमुख भाग में लंबे, पूर्ण या सापेक्ष पथ होते हैं, तो अपने कार्यों को निर्देशिका में स्थानांतरित करने का प्रयास करें: cd /directory/with/long/path; command * और कम तर्क से मेल खाने के लिए एक और त्वरित फिक्स हो सकता है: command [a-e]*; command [f-m]*; ... 


32
2018-06-16 18:11



यदि बहुत सारी फाइलें हैं, तो यह एलएस पर 'तर्क सूची बहुत लंबी' के साथ विफल हो जाती है। - occulus
यह सच है, लेकिन मेरा मानना ​​है कि सवाल यह था कि "मैं एक साधारण खोज कैसे करूं ..." - Ярослав Рахматуллин
ls फ़ाइल नामों को उद्धृत नहीं करता है xargs समझ सकते हैं (no -0 विकल्प, और विभिन्न उद्धरण शैलियों अपर्याप्त हैं) - Tobu


आपको केवल आवश्यकता है ls

तुम यह कर सकते थे find /wherever/your/files/hide -type f -exec ls -1rt "{}" +; जैसा की ऊपर कहा गया है,

या

ls -1rt `find /wherever/your/file/hides -type f`

10
2018-05-18 07:58



यदि बहुत सारी फाइलें हैं, तो यह एलएस पर 'तर्क सूची बहुत लंबी' के साथ विफल हो जाती है। शायद xargs का उपयोग करने के लिए recook? - occulus
लेकिन अगर xargs कॉल ls कई बार, सॉर्ट टूटा जाएगा। - Aaron D. Marasco
यह उनके नामों में रिक्त स्थान वाली फ़ाइलों के लिए विफल रहता है। कोई सलाह? - user74094


विस्तार उपयोगकर्ता 1 9 6696 का जवाब:

find . -type f -printf "%T@\t%Tc %6k KiB %p\n" | sort -n | cut -f 2-

प्रत्येक फ़ाइल के लिए, यह पहले संख्यात्मक टाइमस्टैम्प आउटपुट करता है (क्रमबद्ध करने के लिए, टैबलेशन के बाद \t), फिर एक मानव पठनीय टाइमस्टैम्प, फिर फाइलसाइज (दुर्भाग्य से findकी -printf मेबिबाइट्स, केवल किबाबाइट्स में नहीं कर सकते), फिर रिश्तेदार पथ के साथ फ़ाइल नाम।

फिर sort -n इसे पहले संख्यात्मक क्षेत्र द्वारा क्रमबद्ध करता है।

फिर cut उस पहले संख्यात्मक क्षेत्र से छुटकारा पाता है जो उपयोगकर्ता के लिए कोई रूचि नहीं है। (प्रिंटर दूसरे क्षेत्र को आगे।) डिफ़ॉल्ट फ़ील्ड विभाजक है \t या सारणीकरण।

आउटपुट का उदाहरण:

Thu 06 Feb 2014 04:49:14 PM EST     64 KiB ./057_h2_f7_10/h2_f7_10.class
Fri 07 Feb 2014 02:08:30 AM EST 7962976 KiB ./056_h2_f7_400/h2__rh_4e-4.mph
Fri 07 Feb 2014 02:23:24 AM EST 7962976 KiB ./056_h2_f7_400/h2_f7_400_out_Model.mph
Fri 07 Feb 2014 02:23:24 AM EST      0 KiB ./056_h2_f7_400/h2_f7_400_out.mph.status
Fri 07 Feb 2014 02:23:24 AM EST     64 KiB ./056_h2_f7_400/1579678.out
Fri 07 Feb 2014 03:47:31 AM EST 8132224 KiB ./057_h2_f7_10/h2__rh_1e-5.mph
Fri 07 Feb 2014 04:00:49 AM EST 8132224 KiB ./057_h2_f7_10/h2_f7_10_out_Model.mph
Fri 07 Feb 2014 04:00:49 AM EST      0 KiB ./057_h2_f7_10/h2_f7_10_out.mph.status
Fri 07 Feb 2014 04:00:49 AM EST     64 KiB ./057_h2_f7_10/1579679.out
Fri 07 Feb 2014 09:47:18 AM EST   9280 KiB ./056_h2_f7_400/h2__rh_4e-4.mat
Fri 07 Feb 2014 10:51:23 AM EST   9728 KiB ./018_bidomain/h2_plain__rh_1e-5.mat
Fri 07 Feb 2014 10:58:33 AM EST   9568 KiB ./057_h2_f7_10/h2__rh_1e-5.mat
Fri 07 Feb 2014 05:05:38 PM EST     64 KiB ./058_h2_f7_stationary/h2_f7_stationary.java
Fri 07 Feb 2014 06:06:29 PM EST     32 KiB ./058_h2_f7_stationary/slurm.slurm
Sat 08 Feb 2014 03:42:07 AM EST      0 KiB ./058_h2_f7_stationary/1581061.err
Sat 08 Feb 2014 03:42:14 AM EST     64 KiB ./058_h2_f7_stationary/h2_f7_stationary.class
Sat 08 Feb 2014 03:58:28 AM EST  70016 KiB ./058_h2_f7_stationary/h2s__rh_1e-5.mph
Sat 08 Feb 2014 04:12:40 AM EST  70304 KiB ./058_h2_f7_stationary/h2s__rh_4e-4.mph
Sat 08 Feb 2014 04:12:53 AM EST  70304 KiB ./058_h2_f7_stationary/h2_f7_stationary_out_Model.mph
Sat 08 Feb 2014 04:12:53 AM EST      0 KiB ./058_h2_f7_stationary/h2_f7_stationary_out.mph.status
Sat 08 Feb 2014 04:12:53 AM EST     32 KiB ./058_h2_f7_stationary/1581061.out
Mon 10 Feb 2014 11:40:54 AM EST    224 KiB ./058_h2_f7_stationary/h2s__rh_4e-4.mat
Mon 10 Feb 2014 11:42:32 AM EST    224 KiB ./058_h2_f7_stationary/h2s__rh_1e-5.mat
Mon 10 Feb 2014 11:50:08 AM EST     32 KiB ./plot_grid.m

मैंने जानबूझकर फाइलसाइज फ़ील्ड 6 अक्षरों को बनाया, क्योंकि यदि इसे अधिक लंबा बना दिया जाता है, तो यह स्पष्ट रूप से अंतर करना मुश्किल हो जाता है कि फाइलें कितनी बड़ी हैं। इस तरह, 1e6 KiB jut से बड़ी फ़ाइलें: 1 char का मतलब 1-9 जीबी है, 2 वर्णों से 10-99 जीबी आदि का मतलब है।


संपादित करें: यहां एक और संस्करण है (के बाद से find . -printf "%Tc" MinGW / MSYS पर दुर्घटनाएं):

find . -type f -printf "%T@\t%p\n" | sort -n | cut -f 2- | xargs -I{} ls -Glath --si {}

आउटपुट देना:

-rw-r--r-- 1 es 23K Jul 10  2010 ./laptop_0000071.jpg
-rw-r--r-- 1 es 43M Jul 29 19:19 ./work.xcf
-rw-r--r-- 1 es 87K Jul 29 20:11 ./patent_lamps/US Patent 274427 Maxim Lamp Holder.jpg
-rw-r--r-- 1 es 151K Jul 29 20:12 ./patent_lamps/Edison screw-in socket.png
-rw-r--r-- 1 es 50K Jul 29 20:13 ./patent_lamps/1157 Lamp.jpg
-rw-r--r-- 1 es 38K Jul 29 20:14 ./patent_lamps/US06919684-20050719-D00001.png

कहा पे:

  • -I{} की घटना का कारण बनता है {} एक तर्क से प्रतिस्थापित किया जाना है, तथा न्यूलाइन अब तर्क विभाजक हैं (उपरोक्त फ़ाइल नामों में रिक्त स्थान नोट करें)।

  • ls -G समूह नाम (अंतरिक्ष की बर्बादी) मुद्रण मुद्रित करता है।

  • ls -h --si मानव-पठनीय फ़ाइल आकार उत्पन्न करता है (इसके साथ और अधिक सही --si)।

  • ls -t समय के अनुसार, जो यहां अप्रासंगिक है, लेकिन मैं आमतौर पर इसका उपयोग करता हूं।


3
2018-04-24 08:12



नोट: फ़ाइल द्वारा सॉर्ट करने के लिए आकार इसके बजाय, बस प्रतिस्थापित करें T@ द्वारा s उपर्युक्त आदेशों में से किसी एक में। - Evgeni Sergeev


@ User195696 के उत्तर का ओएस एक्स संस्करण:

  1. टाइमस्टैम्प के साथ:

    find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r
    
  2. टाइमस्टैम्प के बिना:

    find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r | awk -F' ' '{ print substr($0, length($1) + 2) }'
    

2
2018-02-24 15:18





मैंने पाया कि यह मैक ओएस एक्स (और अन्य यूनिक्सन पर भी काम करने के लिए पर्याप्त जेनेरिक) पर काम करता है:

find . -type f -ls | awk '{print $(NF-3), $(NF-2), $(NF-1), $NF}' | sort

1
2017-07-26 07:42



अफसोस की बात है, यह मेरे क्रोएशियाई सेटअप पर स्थानीयकृत महीनों के नाम प्रिंट करता है, जिससे गलत गड़बड़ हो जाती है। - Ivan Vučica
उपयोगकर्ता 1 9 6696 का जवाब क्रोएशियाई सेटअप (और अन्य) के लिए काम करता है। - Peter Mortensen


यदि आपका find चयन बहुत आसान है, आप इसके बिना कर सकते हैं, और बस उपयोग करें ls:

ls -1 *.cc # -r -t optional

1
2018-05-02 11:16





उपयोग:

find . -type f -mtime 0 -printf "[%TD %TI:%TM%Tp] %s %p\n" | sort -n | awk '{
    hum[1024**4]="TB"; hum[1024**3]="GB"; hum[1024**2]="MB"; hum[1024]="KB"; hum[0]="B";
    for (x=1024**4; x>=1024; x/=1024){
    if ($3>=x) { printf $1" "$2"\t%7.2f %s\t%s\n",$3/x,hum[x],$4;break }
    }}';

यह आदेश संशोधित दिनांक द्वारा फ़ाइलों को सॉर्ट करेगा।

और इस तरह प्रदर्शित करें:

[12/05/13 03:10PM] 1.75 MB ./file.text
[12/06/13 11:52PM] 2.90 MB ./file2.mp4
[12/07/13 04:11PM] 4.88 MB ./file3.mp4
[12/07/13 09:17PM] 4.74 MB ./test.apk

1
2017-12-08 09:14



मैंने फ़ाइल नामों में व्हाइटस्पेस को संभालने के लिए इस क्रिप्ट को बेहतर बनाया, देखें superuser.com/a/777007/134532 - jan


मुझे नहीं लगता find आउटपुट ऑर्डरिंग को संशोधित करने के लिए कोई विकल्प है। -mtime तथा -mmin आपको परिणामों को उन फ़ाइलों तक सीमित करने देगा जो एक निश्चित समय विंडो में संशोधित किए गए हैं, लेकिन आउटपुट को सॉर्ट नहीं किया जाएगा - आपको इसे स्वयं करना होगा। जीएनयू find एक -printf विकल्प, जो कि अन्य चीजों के साथ, आपको मिली प्रत्येक फ़ाइल के संशोधन समय को मुद्रित करने देगा (स्वरूप तार %t या %Tk); जो आपको सॉर्ट करने में मदद कर सकता है find जिस तरह से आप चाहते हैं आउटपुट।


0
2018-06-07 18:33