बैश में फ़ाइल की अंतिम संशोधित तिथि प्रिंट करें


147

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

मुझे पता है कि मुझे प्रविष्टि की प्रतिध्वनि के साथ एक तारीख प्रारूप संलग्न करना होगा, लेकिन सभी मुझे सही प्रारूप नहीं मिल सकता है।

echo "Please type in the directory you want all the files to be listed"

read directory 

for entry in "$directory"/*
do
  echo "$entry"
done

2
read -p "कृपया उस डायरेक्टरी में टाइप करें जिसे आप सभी फाइलों को लिस्टेड करना चाहते हैं" डायरेक्टरी
CousinCocaine

जवाबों:


146

आप stat कमांड का उपयोग कर सकते हैं

stat -c %y "$entry"

और जानकारी

अंतिम संशोधन का% y समय, मानव-पठनीय

for entry in "$directory"/* do stat -c%y "$entry" done काम नहीं करता है।
स्टैट्स

हम्म, क्या यह मेरा अनबंटू हो सकता है? क्या आप जानते हैं कि उपयोग की आवश्यकताएं क्या हैं stat?
होकेरी

33
ध्यान दें कि ओएस एक्स (मैक) पर, यह stat -f "%m%t%Sm %N" filename( अधिक विवरण के लिए man stat उदाहरण देखें)
ओली

3
ध्यान दें कि बीएसडी पर statकमांड का एक अलग सिंटैक्स होता है। FreeBSD के लिए मेरा मामला stat -f %Sm -t %F" "%R filename:।
सोपालाजो डे एरियेरेज़

228

क्या 'तारीख' कमांड ज्यादा सरल नहीं है? जागरण, मूर्ति इत्यादि की आवश्यकता नहीं है।

date -r <filename>

इसके अलावा, दिनांक स्वरूपण के लिए मैन पेज देखने पर विचार करें; सामान्य तिथि और समय प्रारूप के साथ उदाहरण के लिए:

date -r <filename> "+%m-%d-%Y %H:%M:%S"

11
बहुत सरल तो स्टेट / अधिक उपलब्ध का उपयोग कर।
आईएनजी

11
ऐसा लगता है कि बीएसडी (या कम से कम ओएस एक्स के) dateके पास ऐसा नहीं है। इसका -rउपयोग प्रारूपण के लिए टाइमस्टैम्प प्रदान करने के लिए किया जाता है। आपको यह कार्यक्षमता प्राप्त करने के लिए GNU दिनांक का उपयोग करना होगा।
वलीद खान

4
OSX उपयोग पर: दिनांकstat -f "%Sm" -t "%m%d%H%M%y" "${1}"
माइकलएंज़ेल X

3
OS X पर 10.10 दिनांक -r <filename> विज्ञापन के रूप में काम करता है, हालांकि मैन पेज किसी भी <filename> तर्क का वर्णन नहीं करता है।
गोमोफित्ज़

3
MacOS में 10.13 पृष्ठ date [-r seconds | filename]में पूरी तरह से प्रलेखित है man, और अपेक्षा के अनुसार काम करता है।
इचेलॉन

14

ओएस एक्स पर, मुझे YYYY-MM-DD HH:MMफ़ाइल के लिए आउटपुट में प्रारूप में होने की मेरी तारीख पसंद है ।

इसलिए एक फ़ाइल निर्दिष्ट करने के लिए मैं उपयोग करूंगा:

stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename]

यदि मैं इसे फ़ाइलों की श्रेणी में चलाना चाहता हूं, तो मैं कुछ इस तरह कर सकता हूं:

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
done

पिछली बार जब मैं sudo periodic daily weekly monthlyलॉग फ़ाइलों का संदर्भ देता हूं, तो यह उदाहरण प्रिंट करेगा ।


प्रत्येक तिथि के तहत फ़ाइल नाम जोड़ने के लिए, मैं इसके बजाय निम्नलिखित चलाऊंगा:

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
  echo "$i"
done

आउटपुट निम्नलिखित था:

2016-40-01 16:40
/var/log/daily.out
2016-40-01 16:40
/var/log/monthly.out
2016-40-01 16:40
/var/log/weekly.out

दुर्भाग्य से मुझे यकीन नहीं है कि लाइन ब्रेक को कैसे रोका जाए और स्क्रिप्ट में अधिक लाइनों को जोड़े बिना फ़ाइल नाम को तारीख के अंत तक जोड़ा जाए।


पीएस - मैं #!/usr/bin/env bashदिन के अनुसार एक पायथन उपयोगकर्ता के रूप में उपयोग करता हूं, और bashइसके बजाय मेरे सिस्टम पर स्थापित के विभिन्न संस्करण हैं#!/bin/bash


यदि आपने लाइन ब्रेक पार्ट का पता नहीं लगाया है, तो ई-फ्लैग इको प्रोग्राम के लिए उपलब्ध है। उदाहरण का उपयोग हो सकता है echo -e "$(stat -f %Sm -t %Y%m%d_%H%M%S $AFile)\t$AFile.":। आपके मामले में यह हो सकता है: echo -e "$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")\t$i." `
थॉट


6

@StevePenny उत्तर को जोड़ते हुए, आप मानव-पठनीय भाग को नहीं काट सकते:

stat -c%y Localizable.strings | cut -d'.' -f1

3

मैं YYYYMMDDHHMMSSप्रारूप में फ़ाइल की संशोधन तिथि प्राप्त करना चाहता था । यहाँ देखें कि मैंने यह कैसे किया:

date -d @$( stat -c %Y myfile.css ) +%Y%m%d%H%M%S

स्पष्टीकरण। यह इन आदेशों का संयोजन है:

stat -c %Y myfile.css # Get the modification date as a timestamp
date -d @1503989421 +%Y%m%d%H%M%S # Convert the date (from timestamp)

2

EDITED: पता चला है कि मैं $entryसही ढंग से प्रिंट करने और "कोई ऐसी फ़ाइल या निर्देशिका" त्रुटि नहीं देने के लिए आवश्यक उद्धरण भूल गया था । मेरी मदद करने के लिए बहुत बहुत धन्यवाद!

यहाँ मेरा अंतिम कोड है:

    echo "Please type in the directory you want all the files to be listed with last modified dates" #bash can't find file creation dates

read directory

for entry in "$directory"/*

do
modDate=$(stat -c %y "$entry") #%y = last modified. Qoutes are needed otherwise spaces in file name with give error of "no such file"
modDate=${modDate%% *} #%% takes off everything off the string after the date to make it look pretty
echo $entry:$modDate

इस तरह से प्रिंट:

/home/joanne/Dropbox/cheat sheet.docx:2012-03-14
/home/joanne/Dropbox/Comp:2013-05-05
/home/joanne/Dropbox/Comp 150 java.zip:2013-02-11
/home/joanne/Dropbox/Comp 151 Java 2.zip:2013-02-11
/home/joanne/Dropbox/Comp 162 Assembly Language.zip:2013-02-11
/home/joanne/Dropbox/Comp 262 Comp Architecture.zip:2012-12-12
/home/joanne/Dropbox/Comp 345 Image Processing.zip:2013-02-11
/home/joanne/Dropbox/Comp 362 Operating Systems:2013-05-05
/home/joanne/Dropbox/Comp 447 Societal Issues.zip:2013-02-11

2

लाइन ब्रेक के लिए मैंने बिना किसी लाइन ब्रेक के कुछ पाने के लिए अपना कोड संपादित किया।

#!/bin/bash
for i in /Users/anthonykiggundu/Sites/rku-it/*; do
   t=$(stat -f "%Sm"  -t "%Y-%m-%d %H:%M" "$i")
   echo $t : "${i##*/}"  # t only contains date last modified, then only filename 'grokked'- else $i alone is abs. path           
done

1

यदि फ़ाइल नाम में कोई स्थान नहीं है:

ls -l <dir> | awk '{print $6, " ", $7, " ", $8, " ", $9 }'

यह निम्न प्रारूप के रूप में प्रिंट करता है:

 Dec   21   20:03   a1.out
 Dec   21   20:04   a.cpp

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

 ls -l <dir> | awk '{printf ("%s %s %s ",  $6,  $7, $8); for (i=9;   i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'

ओह समझा! यह ज्यादातर काम करता है, नामों में रिक्त स्थान के साथ फ़ाइलों को छोड़कर। क्या इसका कोई हल है?
होकेरी

वास्तव में, मैंने इसे फिर से आज़माया, और यह काम नहीं करता है ... यह पता चलता है कि मैं एक निर्देशिका की कोशिश कर रहा था जिसमें रिक्त स्थान के बिना फ़ाइल नाम थे। = / नीचे मेरा जवाब संपादित किया
होकेरी

जब आप कहते हैं कि यह काम नहीं करता है, तो क्या आप कह सकते हैं कि त्रुटि क्या है? यह मेरे लिए काम करता है जब मैंने इसे अपने सिस्टम पर निष्पादित किया।
बिल

मुझे "ऐसी कोई फ़ाइल या निर्देशिका नहीं मिली"।
होकी

ऐसा इसलिए है क्योंकि आपने एक मान पारित <dir>किया है जिसका कोई अस्तित्व नहीं है .... कोड पूरी तरह से ठीक है।
बिल

0

आप उपयोग कर सकते हैं:

ls -lrt filename |awk '{print "%02d",$7}'

यह दिनांक को 2 अंकों में प्रदर्शित करेगा।

यदि 1 से 9 के बीच यह इसमें "0" उपसर्ग जोड़ता है और 01 - 09 में परिवर्तित हो जाता है।

आशा है कि यह अपेक्षा को पूरा करता है।

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