폴더의 수정 타임스탬프를 변경하지 않고 파일을 삽입하시겠습니까?

폴더의 수정 타임스탬프를 변경하지 않고 파일을 삽입하시겠습니까?

보존하고 싶은 수정 타임스탬프가 있는 수백 개의 폴더가 있습니다. 이제 파일을 복사해야 합니다.

이 방법만 빼고...

timestamp=$(stat -c %y /foldername)
cp /tmp/file.jpg /foldername/file.jpg
touch -d "$timestamp" /foldername

...폴더 수정 타임스탬프를 억제하는 더 좋은 방법이 있습니까?

답변1

touch -r또 다른 방법은 .in 을 사용하는 것입니다 zsh:

() {
  touch -r $2:h -- $3 && cp -T -- $2 $3 && touch -r $3 -- $2:h
} /tmp/file.jpg /foldername/file.jpg =(:)

=(:)익명 함수가 종료된 후 즉시 삭제되는 빈 임시 파일을 생성합니다 . -T(강제 cp에게 복사그리고 결코에게 복사)은 GNU 확장입니다.

또는 make는 추가 옵션을 다음으로 전달할 수 있는 함수입니다 cp.

copy_while_preserving_mtime_of_target_directory() {
  # Usage: ... [cp options] source dest
  () {
    touch -r "$@[-1]:h" -- "$1" &&
      cp -T "$@[2,-1]" &&
      touch -r "$1" -- "$@[-1]:h"
  } =(:) "$@"
}

또 다른 접근 방식은 임의의 셸 코드를 인수로 받아들이고 저장 및 복원 디렉터리의 mtime 내용으로 실행을 래핑하는 일부 함수일 수 있습니다.

run_while_preserving_mtime_of() {
  # Usage: ... directory shell-code
  () {
    touch -r "$2" -- "$1" || return
    {
      eval -- "$@[3,-1]"
    } always {
      touch -r "$1" -- "$2"
    }
  } =(:) "$@"
}

다음과 같이 사용됩니다:

run_while_preserving_mtime_of /foldername '
  cp /tmp/file.jpg /foldername/file.jpg
'

예를 들어.

관련 정보