연도별로 파일을 이동하는 방법

연도별로 파일을 이동하는 방법

연도를 기준으로 파일을 이동해야 합니다. 나는 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

관련 정보