리눅스에서 mtime을 유지하는 폴더를 mv로 만드는 방법은 무엇입니까?


12

나는에 CentOS 5.5를 사용하고 있습니다 및 폴더의 큰 금액을 이동하고자하는 하나의 볼륨 내에서 자신을 유지, mtime.

내가 찾을 수있는 가장 좋은 해결책은 다음과 같습니다.

cp -p -r source/data target/
rm -rf source/data

NFS 공유에 1TB가 넘는 데이터가 있으면 복사하는 데 시간이 오래 걸립니다. 복사하고 싶지 않습니다. 나는 즉각적인 움직임을 원합니다.

내가 사용하여 폴더를 이동할 때 mv source/data target/mtime폴더 (안 파일)은 현재 시간으로 설정됩니다. 이동중인 폴더의 내용이이 작업으로 수정되기 때문입니다 ( ..항목이 다른 inode를 가리키고 있음).

나는 다음과 같은 쉘 스크립트를 생각해 냈다 mv_preserve_mtime.sh.

#!/bin/bash
# Moves source folder to target folder. 
# You are responsible for making sure the target does not exist, otherwise this blows up
export timestamp=`stat -c %y $1`
mv "$1" "$2"
touch --date="${timestamp}" $2

글쎄, 그건 작동하지 않았다. 폴더 mtime가 복원되지만 내가 이동하는 폴더 내의 모든 폴더 (1 레벨 깊이의 폴더 만)는 mtime이해할 수없는 이유로 재설정됩니다.

누구나 적절하고 효율적이며 올바른 솔루션을 가지고 있습니까?


왜 당신의 시도가 효과 touch가 없었 는지 궁금 합니다. 그것은인가 mv단계 또는 touch하위 디렉토리의 mtime에 변경 단계? NFS 서버에 어떤 OS가 있으며 어떤 파일 시스템 유형 (알고 있다면)이 있습니까?
Gilles 'SO- 악마 중지

@Gilles : 왜 그런지 모르겠습니다. 그것은이다 mv문제를 발생 단계. NFS 서버는 실제로 NetApp 스토리지이므로 내부에 대해서는 거의 알지 못합니다.
로마 젠카

1
감사. NetApp 이상이라고 생각합니다. 그렇지 않으면 효과 touch가 있었을 것입니다. 그건 그렇고 더 휴대용 방법이 될 것입니다 touch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp.
Gilles 'SO- 악의를 멈춰라'

@Gilles : 매우 흥미롭고, stat이식성 이 없다는 것을 몰랐습니다 .
Roman Zenka

답변:


15

POSIX mv는 atime / mtime 보존을 요구하는 옵션을 제공하지 않지만, 작업이 동일한 볼륨에 국한되어 있으므로 cp다음 -l옵션을 사용하여 일반 파일의 데이터를 복사하는 대신 하드 링크를 사용 하도록 요청할 수 있습니다 .

cp -p -r -l source/date target/
rm -rf source/data

디렉토리와 파일 참조 만 실제로 복사되므로 훨씬 빠릅니다.

하드 링크에 대한 자세한 내용은 해당 Wikipedia 페이지를 참조하십시오.

서브 디렉토리 mtime이 현재 솔루션으로 재설정되는 이유는 상위 디렉토리 mtime 만 가져오고 복원하기 때문입니다. touch는 재귀 명령이 아닙니다.


mtime은 그보다 더 복잡합니다. 상위 디렉토리와 그 바로 아래의 디렉토리 만 mtime이 변경되었습니다. 다른 모든 디렉토리는 동일하게 유지됩니다. 모든 단일 디렉토리가 변경되거나 상위 디렉토리 만 변경 될 것으로 예상합니다.
Roman Zenka

1
실제로는 의미가 있습니다 .1) 상위 디렉토리는 터치로 명시 적으로 설정되었으므로 mtime이 양호합니다 .2) 상위 디렉토리로 다시 작성되었지만 mtime이 수동으로 복원되지 않은 디렉토리 항목 (Unix 디렉토리 구조 및 inode 형식) 3) 나머지 볼륨 구조는 동일한 볼륨을 유지하면서 실제로 변경되지 않았습니다. 따라서 mv"재귀 적"옵션이없는 이유 는 하위 디렉토리로 내림차순으로 실제 복사 (예 : 다른 볼륨)가 필요한 경우에만 수행됩니다.
유레카

@ 유레카 : 좋은 설명이지만 왜 이런 식으로 이루어 집니까? 내가 구현했다 경우 mv디렉토리에 data, 나는 단순히를 바꿀 것 ..에서 data의 내용과 수정 sourcetarget제대로 이동 된 항목을 나열하는 디렉토리. 다른 디렉토리를 건드릴 필요가 없습니다.
로마 젠카

1
@Roman Zenka 일부 검색 후,이 동작은 Unices와 파일 시스템간에 다소 느슨하게 지정되고 rename커널과 사용 된 파일 시스템에 의해 많은 기본 syscall 구현에 의존하여 NFS가 문제에 공유를 추가합니다. 이러한 종류의 불일치를 참조하는 몇 가지 포인터가 있습니다. patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…
Eureka

@ 유레카 : 내가 그렇게 기본이라고 생각하는 것이 엉망이 될 수 있다고 믿기가 매우 어렵다는 것을 알았습니다. 거의 2011 년입니다. 해당 리소스에 감사드립니다!
로마 젠카

4

다른 해결책은 다음과 같습니다.

rsync -a --remove-source-files 소스 / 데이터 대상 /


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