বাশ-এ কোনও ফাইলের সর্বশেষ পরিবর্তিত তারিখ মুদ্রণ করুন


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
পড়ুন -p "দয়া করে যে ডিরেক্টরিটিতে আপনি সমস্ত ফাইল তালিকাভুক্ত হতে চান তা টাইপ করুন" ডিরেক্টরি
কাজিনকোকেইন

উত্তর:


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
ওএসএক্স-এর ব্যবহারে: তারিখstat -f "%Sm" -t "%m%d%H%M%y" "${1}"
মাইচেলঞ্জেল 7007

3
ওএস এক্স ১০.১০-তে তারিখ -আর <ফাইলাইল> বিজ্ঞাপন হিসাবে কাজ করে, যদিও ম্যান পৃষ্ঠাটি কোনও <ফাইল >> আর্গুমেন্ট বর্ণনা করে না।
gotofritz

3
ম্যাকোজে 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

দুর্ভাগ্যক্রমে আমি নিশ্চিত না যে কীভাবে লাইন ব্রেকটি রোধ করা যায় এবং স্ক্রিপ্টে আরও লাইন যুক্ত না করে ফাইলের নামটি তারিখের শেষে যুক্ত করা যায়।


PS - আমি #!/usr/bin/env bashদিনের বেলা পাইথন ব্যবহারকারী হিসাবে ব্যবহার করি এবং এর bashপরিবর্তে আমার সিস্টেমে বিভিন্ন সংস্করণ ইনস্টল করা আছে#!/bin/bash


আপনি যদি লাইন ব্রেকের অংশটি খুঁজে না পেয়ে থাকেন তবে ই-ই প্রোগ্রামের জন্য -e পতাকাটি উপলব্ধ। উদাহরণ ব্যবহার হতে পারে: 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

@ স্টিভপেনি উত্তর যুক্ত করে, আপনি খুব অমানবিক-পাঠযোগ্য অংশটি কাটাতে চাইতে পারেন:

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

সম্পাদনা: দেখা যাচ্ছে যে $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 এ রূপান্তর করে।

আশা করি এটি প্রত্যাশা পূরণ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.