插入文件而不更改文件夹的修改时间戳?

插入文件而不更改文件夹的修改时间戳?

我有数百个带有我想保留的修改时间戳的文件夹。现在我需要将一个文件复制到其中。

除了这种方式...

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

...有没有更好的方法来抑制文件夹修改时间戳?

答案1

另一种方法是使用touch -r.在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"
  } =(:) "$@"
}

另一种方法可能是一些函数,它接受任意 shell 代码作为参数,并将其执行包装在保存和恢复目录的 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
'

例如。

相关内容