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

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

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

그러나이 명령을 성공적으로 실행하려면 정확히 mtime470을 추측해야합니다. 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



답변

다음 -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


답변

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 말이되지 않습니다.


답변

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


답변

다음 one-liners에서 와 같이 stat및 / 또는 date명령 과 조합하여 사용할 수 있습니다 .

BSD / Mac OS X :

find . -type f -print | while read file; do eval `stat -s "$file"`; year=`date -jf "%s" "+%Y" "$st_mtime"`; dest="/path/to/destination/$year; mkdir -p "$dest"; mv "$file" "$dest"; done

리눅스 :

find . -type f -print | while read file; do year=`date -r "$file" "+%Y"`; dest="/path/to/destination/$year; mkdir -p "$dest"; mv "$file" "$dest"; done

두 경우 모두 접근 방식은 date명령 을 사용하여 모든 파일의 마지막 수정 시간에서 연도를 추출한 다음 올해 경로를 구성하는 것입니다. mkdir -p이 경로가 없으면 명령 이이 경로를 만듭니다. 물론 다른 find옵션을 사용 하여 검색을 구체화 할 수도 있습니다.


답변

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

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


답변