쉘 스크립트 — <date> 이후에 수정 된 모든 파일 가져 오기


136

나는 PHP에서 이것을하지 않기를 원하므로 쉘 스크립팅에 능숙한 사람이 도울 수 있기를 바랍니다.

디렉토리를 재귀 적으로 실행하고 마지막으로 수정 한 날짜가있는 모든 파일이 어떤 날짜보다 큰 것을 찾는 스크립트가 필요합니다. 그런 다음 경로 정보를 유지하면서 파일을 tar로 압축합니다.


14
PHP에서하지 않기로 한 좋은 결정.
Kredns

1
php에 의존하지 않고 파이썬, 루비, 펄과 같은 괜찮은 쉘 스크립팅 언어를 사용할 수 있습니다.
garrow

3
@garrow 이것은 FilterIterator에 포함 된 RecursiveDirctoryIterator를 사용하여 PHP에서 실제로 매우 간단합니다.
Artefacto

답변:


136

다음과 같이 간단합니다.

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

여기서 find . -mtime -1전날 수정 된 (재귀 적으로) 현재 디렉토리의 모든 파일을 선택합니다. 예를 들어 분수를 사용할 수 있습니다.

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz

4
파일 이름에서 공백을 처리하는 방법은 아래 user104848의 답변을 참조하십시오
Brian Henk

8
임의의 타임 스탬프를 소수의 상대적 시간으로 변환하는 것은 정확하지 않거나 특히 편리하지 않은 것 같습니다. 아래의 솔루션을 사용 -newermt하면 훨씬 좋습니다.
Bobby Jack

5
디렉토리 구조가 변경된 파일을 추출하려고하면 디렉토리 자체가 수정 된 것으로 표시되어 전체 폴더가 아카이브됩니다. -type f선택한 파일에만 추가 하십시오. 이렇게하면 폴더 구조가 유지되지만 변경 사항이있는 파일 만 백업됩니다.
브렌트

1
@BrianHenk의 user104848 내가 확신 당신이 무슨 뜻이야, 자신의 이름을 변경 (현재) 제이슨 루터에서이 대답을 하지만
icc97

4
질문은 임의 날짜별로 파일을 찾도록 요청합니다. 이 답변은 과거에 임의의 일 수만큼 파일을 찾는 방법입니다. 날짜를 하루 델타로 변환하는 단계를 추가하지 않고 이것이 대답으로 받아 들여질 것이라고 생각하지 않습니다.
Mark

91

GNU가 있다면 find관련 옵션이 있습니다. 유일한 걸림돌은 인터페이스가 별보다 적다는 것입니다.

  • -mmin n (수정 시간 (분))
  • -mtime n (수정 시간 (일))
  • -newer file (파일의 수정 시간보다 새로운 수정 시간)
  • -daystart (현재 시간에서 시작 시간으로 시작 시간 조정)
  • 액세스 시간 및 '변경'또는 '생성'시간에 대한 대안.

어려운 부분은 시간 이후의 시간을 결정하는 것입니다.

고려해야 할 한 가지 옵션 : touch필요한 수정 시간 소인이있는 파일을 작성하는 데 사용하십시오. 그런 다음와 find함께 사용하십시오 -newer.

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

2009-01-03T12 : 31 : 43보다 새로운 파일을 찾습니다. 분명히 스크립트 /tmp/wotsit에서 PID 또는 다른 값을 갖는 고유 한 이름이 될 것입니다. 그리고이 것 trap이 경우에도 사용자 인터럽트 경우, 등등 등등 제거됩니다 보장 할 수 있습니다.


65
대신 -newermt '2009-01-03T12:31:43'참조 용으로 파일을 작성하지 않아도됩니다.
Michael Mior

@MichaelMior : 흥미 롭다-MacOS X 10.7.2 지원의 '찾기' -newermt( -newerXY여러 옵션이 있으므로 아래에 설명되어 있습니다;이 경우 X = m, Y = t). 내가 사용하는 (거의 고풍스러운) Linux 시스템에서 GNU find는 옵션을 지원하지 않으므로 비교적 최근에 도착했습니다. 고마워요
Jonathan Leffler

이 옵션은 시스템에서 사용중인 GNU find 4.4.2에 있습니다.
Michael Mior

2
또한 GNU find는 상대 시간도 지원합니다. -newermt '-2 weeks'.
Cybolic

1
-newermt '2009-01-03T12:31:43'멋져 보이지만 슬프게도 잘못된 시간대의 모든 것을 해석하는 것 같습니다 : lists.gnu.org/archive/html/bug-findutils/2012-12/msg00009.html
antoine

35

tar로 직접 수행 할 수 있으며 더 좋습니다.

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

이것은 tar에게 2014 년 1 월 1 일 18:00:00보다 새로운 파일을 압축하도록 지시합니다.


9
허 .. 1984 년부터 유닉스를 사용해 왔는데 이것을 전혀 몰랐습니다. 항상 배울 것이 있습니다.
John

그 구현은 tarOS X와 ​​FreeBSD 만 지원 하며 GNU에서 --newer긴 옵션입니다 . -Ntar
nisetama

이것은 대단합니다 ...- xcvf와 gz 확장자를 사용하지 않고 bzip으로 만 작동시킬 수 있었지만 전문가는 아닙니다.
phil

17

이것은 몇 개의 파일에서 작동합니다. 경로에 공백이있는 경우 "-print0"및 "xargs -0"을 포함하려고합니다. 이 예에서는 지난 7 일 동안 수정 된 파일을 찾습니다. 지난 7 일 전에 수정 된 항목을 찾으려면 "+7"을 사용하십시오.

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

이 페이지에서 경고하는 것처럼 인수가 많으면 xargs로 tar 명령이 여러 번 실행될 수 있으며 "-c"플래그는 문제를 일으킬 수 있습니다. 이 경우 다음을 원할 것입니다.

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

tar로 압축 된 tar 아카이브를 업데이트 할 수 없으므로 두 번째 단계에서 bzip2 또는 gzip으로 압축해야합니다.


1
두 번째 요점과 관련하여 Gnu tar의 -z 옵션과 같은 gzip 사용 tar 명령을 사용하여 압축 된 아카이브도 업데이트 할 수 있습니다.
Suncat2000

또는 최신 GNU tar에서 bzip을 사용하려면 'j'옵션을 추가하십시오
hd1

3
Jonathan의 답변에 대해 위에서 말했듯이 변경 사항이있는 폴더를 가져 와서 모든 파일을 가져옵니다. -type f선택한 파일에만 추가 하십시오. 이것은 폴더 구조를 유지하지만 최근에 변경 / 추가 된 파일 만 백업합니다.
브렌트

12

지난 7 일 이내에 수정 된 모든 파일이 표시됩니다.

find . -type f -mtime -7 -print

그것을 tar / zip으로 파이프하면 좋을 것입니다.


3

리눅스에서 find 명령의 맨 페이지를 읽으십시오.

man find

이와 같은 것

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

그리고 당신은 그것을 가지고


3

다음을 사용하여 x 일 전에 늦게 수정 한 파일 목록을 얻을 수 있습니다.

find . -mtime -x

그런 다음 결과 목록에서 파일을 tar 및 zip으로 압축하면됩니다. 예 :

tar czvf mytarfile.tgz `find . -mtime -30`

지난 달에 수정 된 모든 파일에 대해


3
"-mtime x"는 정확히 "x"일 전에 수정 된 파일과 일치합니다. "-mtime -x"를 사용하여 "x"일 전에 수정 된 파일과 일치 시키십시오.
랜스 리차드슨

3

7 일 전에 모든 새 파일을 백업하려면 다음을 수행하십시오.

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

'7 일 전'을 필요에 맞는 것으로 바꿀 수도 있습니다.

될 수 있습니다 : date -d'yesterday' +"%d-%b"

또는 : date -d'first Sunday last month' +"%d-%b"


2

이 스크립트는 지정된 날짜 전후에 수정 날짜가 2 분인 파일을 찾습니다 (필요에 따라 조건의 값을 변경할 수 있음)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

예를 들어, 당신은 주어진 날짜 만 변경할 수 있습니다 전에 파일이 수정 날짜를 가지고 원하는 1200$DIFF_IN_DATE의 조건 폐기 매개 변수 $DIFF_IN_DATE1매개 변수를.

마찬가지로 당신은 파일을 그냥 교체 1 시간 전에 주어진 일 이후 수정 날짜를 가지고 싶다면 120의해 3600에서 if CONDITION.

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