연도를 기준으로 파일을 이동하는 방법

연도를 기준으로 파일을 이동하는 방법

연도를 기준으로 파일을 이동해야 합니다. 나는 find명령 을 사용했다

find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6

하지만 이 명령을 성공적으로 실행하려면 정확한 숫자를 알아야 합니다. mtime이제 470은 단지 추측일 뿐입니다. 2012년을 입력하면 2012년과 관련된 파일만 제공된다는 의미입니다.

그래서 어떻게 해야할지 조언이 필요해요

예를 들어 2012년을 기준으로 파일을 찾아 다른 디렉토리로 이동합니다.

OS release 5.2

FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 

답변1

-newermt다음에 대한 옵션을 사용하고 싶습니다 find.

find /media/WD/backup/osool/olddata/ -newermt 20120101 -not -newermt 20130101

수정 시간이 2012년인 모든 파일을 얻으려면

찾기가 지원되지 않는 경우 -newermt다음을 수행하여 오프셋 계산 사용을 방지할 수도 있습니다.

touch -d 20120101 /var/tmp/2012.ref
touch -d 20130101 /var/tmp/2013.ref
find /media/WD/backup/osool/olddata/ -newer /var/tmp/2012.ref -not -newer /var/tmp/2013.ref

맨페이지

-newerXY reference
          Compares the timestamp of the current file with reference.   The
          reference  argument  is  normally the name of a file (and one of
          its timestamps is used for the comparison) but it may also be  a
          string  describing  an  absolute time.  X and Y are placeholders
          for other letters, and these letters select which time belonging
          to how reference is used for the comparison.

          ...

          m   The modification time of the file reference
          t   reference is interpreted directly as a time

답변2

touch --date=2011-12-31T23:59:59 start
touch --date=2012-12-31T23:59:59 stop
find / -newer start \! -newer stop -printf %Tx" "%p\\n

-exec ls아무 의미가 없습니다.

답변3

매뉴얼 페이지에 따르면 -mtime에 대한 인수는 찾고 있는 일수입니다. date +%j올해 1월 1일 이후의 일수를 구하는 데 사용할 수 있습니다 .

답변4

작업 디렉토리에서 이 작업을 수행하는 경우 대신 다음을 수행할 수 있습니다.

ls -l |awk '{ if ($8 == "2013") print $9 }'

이렇게 하면 작업이 상당히 단순화되고 중복이 발생하지 않습니다. 그러나 또한 이러한 파일이 6개월보다 오래되었다고 가정하므로 ls정확한 시간 대신 연도가 인쇄됩니다.

6개월이 넘은 파일의 경우 다음과 같이 바꾸면 됩니다.

ls -l |awk '{ if ($6 == "May") print $9 }' 

또는 달에 따라 이와 유사한 것. 파일을 이동할 월 목록을 생성하려면(또는 연도 목록을 생성하려면) 다음을 수행하십시오.

month="May Jun Jul"; 
for i in `echo $month`; 
do 
    for j in `ls -l |awk '{ if ($6 == "'$i'") print $9}'`
    do
        mkdir -p $i
        mv $j $i
    done
done

관련 정보