Bash

插入文件而不更改文件夾的修改時間戳?

  • April 25, 2022

我有數百個帶有修改時間戳的文件夾,我想保留。現在我需要將一個文件複製到其中。

除了這條路…

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

…有沒有更好的方法來抑製文件夾修改時間戳?

另一種方法是使用touch -r. 在zsh

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

Where=(:)創建一個空的臨時文件,一旦匿名函式終止,該文件就會被刪除。-T(強制cp成為copy-to而不是copy-into)是 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
'

例如。

引用自:https://unix.stackexchange.com/questions/700274