2009-11-01 2 views
3

File :: Copy 모듈을 사용하여 Perl에서 파일을 복사합니다.Perl로 파일을 복사하고 타임 스탬프를 유지하려면 어떻게해야합니까?

#! /usr/bin/perl -w 

use File::Copy; 

copy("somefile.log", "copiedfile.log"); 

타임 스탬프 (특히 수정 시간)를 보존하고 싶지만 옵션이 아닌 것으로 보입니다.

"cp -p"에 대한 시스템 호출을하지 않고도이를 수행 할 수있는 간단한 방법이 있습니까?

+0

타임 스탬프를 저장하고 (stat 사용) 복사본을 만들고 타임 스탬프를 다시 적용합니다 (utime 사용). (touch 명령과 동일) –

+0

제임스, 브라이언의 대답은 다음과 같습니다. "광대 한 Perl 라이브러리에"복사 및 보존 특성 "기능 (Linux에서 작동 함)이없는 경우 놀랍습니다." "Linux에서의 작업"을 의미합니까? cp -p에 대해 이야기하고 있다면, 리눅스의 소스 코드는 위에서 제시 한 것과 똑같습니다. stat와 utime을 사용하여 "보존"을하십시오. 여기에 : (* (x-> xstat)) (src_path, & src_sb) ... \t utb.actime = src_sb.st_atime; \t utb.modtime = src_sb.st_mtime; \t utime (dst_path, & utb) –

+0

Murali, Perl은 rmscopy (아래의 ghostdog74 답변 참조)라는 깨끗한 "사본 및 보존 속성"명령을 가지고 있지만 VMS 시스템에서만 사용할 수 있습니다. Windows에서는 파일을 복사하는 표준 의미 체계가 타임 스탬프를 보존한다고 생각하기 때문에 syscopy가 작업을 수행 할 것이라고 생각합니다. 리눅스에서는 그렇지 않습니다. 그래서 세 줄의 "copy, stat, utime"조합이 가장 깨끗한 "Perl"솔루션입니다. 이것은 나에게보기 흉한 것으로 보이지만, 시스템 호출을 다시하지 않으면 유일한 옵션 인 것 같습니다. –

답변

4

stat을 사용하면 타임 스탬프를 얻고 utime을 사용하여 설정할 수 있습니다. 그걸로 도망 갈 수 있다면, 시스템이 항상 나쁜 것은 아닙니다. cp -p보다 빠른 것을 만들지 않을 것입니다. File::Copy은 그렇게 하겠지만 유닉스에서는 그렇지 않을 것입니다. Abigail은 RT #96158을 제기했지만 아무런 조치없이 폐쇄되었습니다. 그는 부서짐에 대한 프레젠테이션을 가지고 있지만 온라인으로는 보지 못했습니다.

+0

stat와 utime은 옵션이지만 "직접적인"기준은 아닙니다. 아마 Perl 라이브러리에 "copy and preserve"기능 (Linux에서 작동 함)이 없다면 놀랄 것입니다. –

+3

어쩌면 직설의 정의가 다릅니다. 좋은 모듈이 없다는 것에 놀란 것에 대해서는 아무도 File :: Copy의 손상이 얼마나 믿을 수 있는지 염려하지 않으므로 아무도 더 나은 모듈을 제공하지 못하기 때문입니다. –

+1

이것이 최상의 솔루션 인 것 같습니다. 내 프로그램에서 나는'cp -p'를 사용했다. 이것은 배포 할 의도가없는 상당히 쓸모있는 스크립트에 대해 받아 들일 만하고 간단하다. 그러나 나는 깨끗한 해결책이 복사본, stat 및 utime을 마무리하는 것이라고 생각한다. 깔끔한 라이브러리 기능으로 –

4

체크 File::Copy을 확인하십시오. syscopy 또는 rmscopy을 찾으십시오. 거기에 타임 스탬프에 대해 이야기합니다.

+0

http://perldoc.perl.org/File/Copy.html –

+0

rmscopy는 유망 해 보였지만 VMS 시스템에서만 사용할 수 있습니다 (Linux는 사용하지 않습니다). 문서 서식이 약간 명확하지 않지만, 5.10.0 설치에서 Copy.pm 파일을 체크인했고 rmscopy가 정의되지 않았습니다. –