我有数百个带有我想保留的修改时间戳的文件夹。现在我需要将一个文件复制到其中。
除了这种方式...
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
'
例如。