フォルダの編集タイムスタンプを変更せずにファイルを挿入しますか?

フォルダの編集タイムスタンプを変更せずにファイルを挿入しますか?

保存したい修正タイムスタンプを持つ数百のフォルダがあります。これでファイルをコピーする必要があります。

この方法を除いて...

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
'

例えば。

関連情報