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


14

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 

-exec ls ... \;대신에 사용하는 것이 합리적 -exec ... +입니까? 당신의 발견이 너무 오래 되었습니까? 이 경우 find ... -print0 | xargs -0 ls...훨씬 빠릅니다.
Hauke ​​Laging

coreutils를 다루는 이러한 질문 (및 답변)이 일상적으로 우리가 GNU 또는 BSD (또는 다른) utils를 다루는 지 여부를 지정하기를 바랍니다.
미로

답변:


37

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

1
찾기 명령에서 -newermt 플래그를 사용할 수 없음
OmiPenguin

RHEL과 함께 제공되는 이전 버전의 찾기 여야합니까? 이에 대한 대안으로 대안을 제공 할 것입니다
Anthon

예, 이것은 5.2입니다
OmiPenguin

나는 RHEL의 개정판이 아니라 find(4.4.2 버전을 찾았습니다)
Anthon

1
newermt 스위치는 v4.3.3 이후 버전 인 gnu.org/software/findutils/manual/html_mono/find.html까지 find에 나타나지 않았습니다 .
slm

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


1
-exec ls -l테스트하는 동안 더 의미 있고 더 많은 것을 의미합니다.
CVn

@ MichaelKjörling find은 가능한 모든 것을 인쇄 ls할 수 있습니다. 한 가지 예외는 있지만 불쾌한 문자를 이스케이프 / 인용하는 것입니다. 그러나 일반적으로 출력을 find직접 정렬 할 수 있습니다. 쓸데없는 ls 호출은 모든 것을 더 빨리 만들지 않습니다.
Hauke ​​Laging

나는 종종 테스트하는 동안 (개인적으로 선호 -print하거나 가능 하지만) 매우 비슷한 것을 사용합니다 -ls. 사용의 이점은 -exec ls {}이미 찾기 위해 외부에서 무언가를 실행한다는 것 입니다. 에서 ls로 전환 할 때까지 mv실제 변경 사항은 최소화됩니다.
CVn

3

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


2
좋은 방법입니다. 매우 "nitpicky"가 되려면 : -mtime -1 :은 지난 24 시간 동안의 파일입니다. 어제 (오늘)의 파일 만이 아닙니다. 따라서 약간의 "중복"도있을 것입니다. 2012 년 이후 120 일이 지났으며 현재 스크립트를 시작할 때 15:45가되면 12 월 31 일 15:45까지 파일을 선택하게됩니다. nb_day-1을 사용한 다음 2013 년부터 시작된 소수의 사람들을 "잡아냅니다"(ls -l | grep -v, BUT로 찾을 수 있음) 그들이 단지 1 일 된 경우 출력이 다릅니다 ... 많은 함정 ...)
Olivier Dulac

-daystart작업 할 경우이 옵션 을 사용 하려고합니다 -mtime. 그렇지 않으면 자정에 정확하게 실행하지 않으면 연중 무휴로 파일에 문제가 발생합니다. 새해 이후의 시간 (분)을 쉽게 찾을 수있는 경우 -mmin보다 더 정확하게 오프셋을 수행 -mtime할 수 있습니다. 그러나 -mtime파일 수는 적습니다 (새해 자정 무렵 1 분).
Anthon

1
예, 매뉴얼 페이지를 다시 읽으면 몇 시간으로 나누는 방법을보고 있으므로 간단한 작업을 수행 find -mtime $("date -+%j")하면 OP가 원하는 것을 제공하지 못할 수 있습니다. 나는 사람들이 빠질 수있는 사각 지대처럼 보이기 때문에 후손을 위해 그것을 떠날 것입니다.
Bratchley

2

다음 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옵션을 사용 하여 검색을 구체화 할 수도 있습니다.


1

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

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