Bash에서 파일의 마지막 수정 날짜를 인쇄하십시오.


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 작동하지 않습니다. 통계 출력 : 터미널에 피연산자가 없음
Hokerie

흠, 내 운 분투 일까? 사용 요구 사항이 무엇인지 알고 stat있습니까?
Hokerie

33
OS X (Mac)에서는 다음과 같습니다 stat -f "%m%t%Sm %N" filename( 자세한 내용 은 man stat 예제 참조)
Olie

3
BSD에서는 stat명령의 구문이 다릅니다. FreeBSD에 대한 나의 경우 : stat -f %Sm -t %F" "%R filename.
Sopalajo de Arrierez 2016

228

'date'명령이 훨씬 간단하지 않습니까? awk, stat 등 불필요

date -r <filename>

또한 날짜 형식 에 대해서는 매뉴얼 페이지참조하십시오 . 예를 들어 일반적인 날짜 및 시간 형식의 경우 :

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

11
stat / more를 사용하면 훨씬 간단합니다.
Ing

11
BSD (또는 적어도 OS X) date에는없는 것처럼 보입니다 . 그것은 -r단지 형식으로 타임 스탬프를 제공하는 데 사용됩니다. 이 기능을 사용하려면 GNU 날짜를 사용해야합니다.
Waleed Khan

4
OSX 사용 : 날짜stat -f "%Sm" -t "%m%d%H%M%y" "${1}"
Michaelangel007

3
매뉴얼 페이지에서 <filename> 인수를 설명하지 않지만 OS X 10.10 날짜 -r <filename>은 알려진대로 작동합니다.
gotofritz 2016 년

3
macOS 10.13에서는 페이지에 date [-r seconds | filename]완전히 설명되어 man있으며 예상대로 작동합니다.
Echelon

14

OS X에서는 날짜가 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


줄 바꿈 부분을 찾지 못한 경우 에코 프로그램에 -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

@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

편집 : $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")}'

아, 알겠다! 이름에 공백이있는 파일을 제외하고는 대부분 작동합니다. 그에 대한 해결책이 있습니까?
Hokerie

실제로, 나는 그것을 다시 시도했지만 작동하지 않습니다 ... 공백없이 파일 이름을 가진 디렉토리를 시도하고있는 것으로 나타났습니다. = / 아래 답변을 수정했습니다
Hokerie

작동하지 않는다고 말할 때 오류가 무엇인지 말할 수 있습니까? 내 시스템에서 실행할 때 작동합니다.
Bill

"그런 파일이나 디렉토리가 없습니다".
Hokerie

<dir>존재하지 않는 값을 전달했기 때문에 코드가 완벽합니다.
Bill

0

당신이 사용할 수있는:

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

날짜가 2 자리로 표시됩니다.

1 에서 9 사이 인 경우 "0"접두사가 추가되고 01-09로 변환됩니다.

이것이 기대에 부응하기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.