하루보다 새로운 파일을 찾아 복사


12

마지막 날에 만든 파일 만 다른 폴더로 복사하는 스크립트를 작성 중입니다. 내가 겪고있는 문제는 하루 미만의 파일 대신 원본 디렉토리의 모든 파일을 복사하는 스크립트입니다.

이것이 내가 가진 것입니다 :

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

위의 코드는 소스 디렉토리의 모든 파일을 복사합니다. 'cp'에 대한 모든 인수를 제거하면 작동합니다.

find . -mtime -1 -exec cp "{}" /somefolder \;

위의 코드는 원하는 최신 파일 만 복사하지만 cp 인수를 사용하여 속성을 유지해야합니다.

나는 또한 변수를 시도했고 for 루프는 -exec 옵션이 문제라고 생각했습니다.

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

그러나 위의 for 루프로 인해 동일한 문제가 발생하여 모든 파일이 복사됩니다. $ files를 에코하면 필요한 파일 만 표시됩니다.

이 기능을 작동 시키려면 어떻게해야합니까?


1
좋아, 나는 그것을 사용하여 작동한다고 생각합니다 :find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234

rsync가 cp 대신이 작업을위한 더 좋은 도구가 아닙니까? rsync-소스 목적지
Darryl

답변:


9

일부 구현 cp에는 -t옵션이 있으므로 대상 디렉토리 파일 앞에 둘 수 있습니다.

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

따라서 후자를 제거 했음을 -a의미 --preserve합니다.


이것은 또한 오래된 파일로 폴더를 복사합니다 ...?
Luis A. Florit

3

pax다음과 같이 사용할 수 있습니다 .

pax -wrT "11$(date +%H%M)," . /destination/folder

비트 단위 명령 줄 :

  • -wr- 때 pax모두 넘겨진다 -w의식과 -rEAD 옵션 그것을 복사. 여기서도 유용합니다. (그러나 위의 명령에는 포함되지 않음)

    • -l잉크-파일 데이터를 복사하지 않고 가능한 경우 하드 링크를 만듭니다.

    • -Xpax동일한 소스 장치 및 / 또는 파일 시스템으로 제한 합니다.

    • -s/src regex/replace/ -파일 이름을 인스 트림으로 수정합니다.

    • -verbose-소스 / 타겟팅 된 파일을보고합니다.

  • -T- -T대상 아카이브에 대한 IME 옵션 선택 파일 (함께 사용할 경우 또는 단순히 복사하는 -wr) 자신의 기반으로 /modification 또는 아이 노드 /change (또는 둘 다) 번. 기본적으로 모드 시간입니다. 에서...

남자 인원

  • ... 두 파일 시간을 사용한 시간 비교는 pax를 사용하여 시간 기반 증분 아카이브를 만들 때 유용합니다 (지정된 시간 범위 동안 변경된 파일 만 아카이브됩니다).

  • 시간 범위는 6 개의 서로 다른 필드로 구성되며 각 필드에는 두 자리 숫자가 포함되어야합니다. 형식은 다음과 같습니다.

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • cc연도의 첫 두 자리 (세기)는 어디에 있고, 연도 yy의 마지막 두 자리는 첫 번째 mm는 달 (01부터 12까지)이며, dd그 달의 날짜 (01부터 31까지) HH는 하루 중 시간 (00 ~ 23), MM분 (00 ~ 59), SS초 (00 ~ 59)입니다. 분 필드 MM는 필수이며 다른 필드는 선택 사항이며 다음 순서로 추가해야합니다.

    HH, dd, mm, yy, cc

  • SS필드는 서로 독립적 필드로 첨가 할 수있다. 시간 범위는 현재 시간을 기준으로하므로 ...

    -T 1234/cm

  • ... 오늘 이후에 수정 또는 inode 변경 시간이 12:34 PM 인 모든 파일을 선택합니다.

  • 여러 -T시간 범위를 제공 할 수 있으며 첫 번째 일치로 검사가 중지됩니다.

... 11내 예제 명령 의 위쪽은 오늘과 관련이 있습니다. 오늘은 12 일이며 오늘 날짜보다 적습니다. 나머지는 표준 "$(date)"형식이며 쉼표가옵니다.

... 예외-마지막으로 언급 할 가치가있는 부분-대상 디렉토리에 절대 경로를 사용합니다. 따라서 그렇게해야합니다. 문서는 모두 상대 대상 경로에 대해 지정되지 않은 동작 을 참조 합니다. 처음으로 사용하려고 시도했을 pax때 절대 경로를 사용할 때까지 모든 이상한 결과와 혼동되어 숨을 쉴 시간이 없었습니다 .


2

도움을 주신 모든 분들께 감사드립니다. 제안을 조합하여 도움을 받으십시오.

아래 코드와 함께 완벽하게 작동합니다.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

다시 감사합니다!


2

정확히 동일한 기능을 수행했지만 폴더 구조를 유지해야했습니다. 따라서 내가 한 일은 약간 다릅니다.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

여기서 $ days는 일 수입니다. $ tarpath는 이러한 파일을 저장하기위한 임시 경로입니다. 복원하고 싶을 때

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

그것은 나를 위해 속임수를 만들었습니다.

참고 : 백업하는 동안 일부 폴더를 제외하려면 다음 명령을 사용할 수 있습니다

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

장점 : 1. 나는 항상 지난번에 복원 한 사본을 압축 형식으로 가지고있었습니다.

  1. 또한 복원 사이에 일시 중지가되어 해당 파일이 무엇인지 확인하고 모두 괜찮다면 스크립트를 진행합니다.

  2. 폴더 구조를 유지하므로 소스 디렉토리에서 대상 디렉토리로 수정 된 파일을 덮어 씁니다.

참고 : 반면에 요구 사항이 하루 제한이 아닌 경우 rsync를 사용합니다.

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

날짜 rsyc 더 여기


1

특정 일수로 돌아 가지 않고 정확한 날짜와 시간을 선택할 수도 있습니다.

(이것은 파일 이름에 공백, 탭 또는 와일드 카드가없는 경우에만 잘 작동합니다)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

위에서 2016 년 12 월 17 일 20:10:00 이후에 생성 된 디렉토리의 모든 파일을 FOLDER (오늘 1 일 전)에 복사합니다.

find 명령의 기호에주의하십시오. 이것은 다음이 아닙니다 : '이것은 백틱입니다 :`날짜 선택은 다음과 같습니다 :'

이름에 공백, 탭, 줄 바꿈 또는 와일드 카드가 포함 된 파일의 경우 Stéphane Chazelas의 솔루션 중 하나를 사용할 수 있습니다. 첫 번째는 GNU, 두 번째는 GNU 또는 일부 BSD입니다.

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


Stephane에게 감사드립니다. 그래서 어떤 게시물에서도 이것을 찾을 수 없었습니다. 내 경우에는 매력처럼 작동했습니다. 당신이 할 때만 찾을 수 있습니다. -type f -newermt '17 dec 2016 20:10:00 '
FatihSarigol

... 그 후 생성 된 파일을 인쇄합니다. 어떤 종류의 문제가 발생했는지 잘 모르겠습니다. 그런 다음 백틱을 사용하여 복사 할 파일을 선택합니다. 건배
FatihSarigol

공유 한 게시물이 "루프 오버"에 관한 것이라고 생각합니다. 내 코드가 찾기 결과를 반복합니까? 아니면 그냥 복사로 사용할 찾기 결과를 선택합니까? (죄송합니다. 3 개의 댓글에 대해 죄송하지만 아직 내 댓글을 편집 할 수 없습니다.
FatihSarigol

1
사용 find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) 또는 find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU 또는 일부 BSD의 (제한 요인의 WRT 이식성이있다 -newermt여기 술어)).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.