쉘 스크립트 — <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

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

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

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