ls -al 후 나열된 파일들 특정시간별 뽑아오기

cdral의 이미지

# ls -al
-rw-r--r-- 1 apache apache 6379 11¿ù 23 19:32 12589723543174.gif
-rw-r--r-- 1 apache apache 6379 11¿ù 23 19:33 1258972414547.gif
-rw-r--r-- 1 apache apache 6379 11¿ù 23 19:35 12589725051368.gif
-rw-r--r-- 1 apache apache 5892 11¿ù 23 19:35 12589725051368_s.gif
-rw-r--r-- 1 apache apache 6379 11¿ù 23 19:36 12589726084355.gif
-rw-r--r-- 1 apache apache 5892 11¿ù 23 19:36 12589726084355_s.gif
-rw-r--r-- 1 apache apache 6379 11¿ù 23 19:40 12589728563645.gif
-rw-r--r-- 1 apache apache 5892 11¿ù 23 19:40 12589728563645_s.gif
-rw-r--r-- 1 apache apache 6379 11¿ù 26 13:55 12592113097356.gif
-rw-r--r-- 1 apache apache 5892 11¿ù 26 13:55 12592113097356_s.gif ------- 1
-rw-r--r-- 1 apache apache 47980 12¿ù 15 13:56 1260852988119.jpg
-rw-r--r-- 1 apache apache 12478 12¿ù 15 13:56 1260852988119_s.jpg
-rw-r--r-- 1 apache apache 26508 12¿ù 15 13:57 12608530723087.jpg
-rw-r--r-- 1 apache apache 6166 12¿ù 15 13:57 12608530723087_s.jpg
-rw-r--r-- 1 apache apache 26508 12¿ù 15 13:59 12608531699557.jpg
-rw-r--r-- 1 apache apache 6166 12¿ù 15 13:59 12608531699557_s.jpg
-rw-r--r-- 1 apache apache 26508 12¿ù 15 14:00 12608532512575.jpg
-rw-r--r-- 1 apache apache 6166 12¿ù 15 14:00 12608532512575_s.jpg
-rw-r--r-- 1 apache apache 17471 1¿ù 12 15:59 12632795665299.jpg -------- 3
-rw-r--r-- 1 apache apache 3929 1¿ù 12 15:59 12632795665299_s.jpg

글자깨진건 "월" 이구요
여기서 특정 월+일별 파일은 뽑아오겟는데요 위에 1부터 3까지 저런 범위를 지정하고
뽑아올려면 어떻게 해야하는지요 그리고 시간별로도 뽑고싶은데 범위지정도 안되고해서 어렵습니다.

또한 저 화면에서 파일명 sort는 되겟지만 시간별 sort도 가능한지 궁금하군요

agongi의 이미지

리눅스에 있는 3가지 시간대중에서 지금 ls에서 결과로 나온 시간대로 정렬을 한다는 말씀인가요?

default로 ls에서는 mtime이 나오게되어있으므로

옵션으로 t 를 주면 파일명이 아니라 시간대별로 정렬되어서 나옵니다

ls -lt

aero의 이미지

ls -ltr 로 시간 오름차순으로 정렬되게 한뒤
이것을 Perl의 정규식과 범위연산자로 특정 범위를 뽑아내면 됩니다.

참고 http://kldp.org/node/100909#comment-469191

user@doc:~$ ls -ltr
total 51796
-rwxr-xr-x  1 user user       61 2008-11-21 14:24 backup
-rw-r--r--  1 user user       66 2008-11-28 11:10 ssh_
-rw-r--r--  1 user user     2739 2009-01-07 23:04 ssh_k
-rwxr-xr-x  1 user user       57 2009-03-10 10:25 show_access
-rwxr-xr-x  1 user user       56 2009-03-10 13:57 show_error
lrwxrwxrwx  1 user user       44 2009-03-10 22:32 user
drwxr-xr-x  4 user user     4096 2009-03-28 15:12 _BA
drwxr-xr-x  2 user user     4096 2009-05-19 12:00 www
drwxr-xr-x  2 user user     4096 2009-05-25 21:29 MY
drwxr-xr-x  5 user user     4096 2009-06-07 01:00 pe
-rwxr-xr-x  1 user user    10139 2009-06-12 14:54 check
drwxr-xr-x  4 user user     4096 2009-06-26 15:34 slac
-rw-r--r--  1 user user      198 2009-07-12 22:56 s
-rw-r--r--  1 user user      194 2009-07-13 00:50 sl
drwxr-xr-x  3 user user     4096 2009-08-24 12:12 p
-rw-r--r--  1 user user     1325 2009-10-03 01:22 url.txt
-rw-r--r--  1 user user      137 2009-10-09 17:09 start
drwxr-xr-x  6 user user     4096 2009-10-17 12:59 PROJECT
-rw-r--r--  1 user user      188 2009-11-04 00:35 ss
-rw-r--r--  1 user user 50841162 2009-11-22 20:04 Adobe
-rw-r--r--  1 user user    42845 2009-12-24 19:38 tra
-rw-r--r--  1 user user      370 2009-12-31 23:21 twit
-rw-r--r--  1 user user  1982703 2010-01-09 20:35 use
drwxr-xr-x 19 user user     4096 2010-01-09 23:09 www
-rw-r--r--  1 user user      512 2010-01-18 15:13 m.pl
-rw-r--r--  1 user user      310 2010-01-19 13:37 t.pl
drwxr-xr-x 17 user user     4096 2010-01-28 11:26 tmp
user@doc:~$
user@doc:~$
user@doc:~$ ls -ltr | perl -ne 'print if /2009-10-09 17/ .. /2010-01-09/'
-rw-r--r--  1 user user      137 2009-10-09 17:09 start
drwxr-xr-x  6 user user     4096 2009-10-17 12:59 PROJECT
-rw-r--r--  1 user user      188 2009-11-04 00:35 ss
-rw-r--r--  1 user user 50841162 2009-11-22 20:04 Adobe
-rw-r--r--  1 user user    42845 2009-12-24 19:38 tra
-rw-r--r--  1 user user      370 2009-12-31 23:21 twit
-rw-r--r--  1 user user  1982703 2010-01-09 20:35 use
user@doc:~$

ls 결과가 한글로케일 환경이라도 정규식부분만 적절히 바꾸면 되겠죠?

agongi의 이미지

전 awk나 sed를 조합하는 방법으로 막 생각해보다가 어려워서 일단 시간대별 정리만 댓글을 달았었는데

perl도 사용할수 있군요. 죄송한데 perl의 기본적인 사용방법이 나와있는 wiki가 있을까요?

jg의 이미지

저도 perl을 좋아하긴 하지만
날짜+시간 은 숫자가 작은 편이니까 awk를 사용한다면 아래와 같은 방법도 가능할 것 같습니다.

ls -ltr  | 
awk '{
  date_time = $6$7;
  gsub( "[:-]", "", date_time);
  if ( date_time > 200912312359 && date_time < 201002010000 ) print;
}'

위의 코드에서는 2010년 1월에 생성된/수정된 파일을 추려줍니다.
다만 위의 코드는 ls에서 굳이 정렬을 하지 않아도 동작하고..
(정렬이 되어 있다면 방대한 자료에 대해서는 if문을 중첩되게 사용하고 범위가
벗어 나면 더이상 검색하지 않도록 하면 조금더 최적화 되겠지요..)

...
BEGIN {
  middle = 0;
}
...
if ( middle ) {
  print;
  if ( date_time < 20102010000 ) {
    exit;
  }    
} else {
  if ( date_time > 200912312359 ) {
  middle = 1;
  }
}
...

대충 생각한 거라 정확한지는 모르겠군요..

---
아.. 다시 확인해보니 gsub()를 사용하지 않아도 비교에는 지장이 없군요. ^^;

ls -ltr  | 
awk '{
  date_time = $6" "$7;
  if ( date_time > "2009-12-31 23:59" && date_time < "2010-02-01 00:00" ) print;
}'

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

cdral의 이미지

좋은 답변들 감사합니다.
덕분에 많은 도움이 되었습니다.