シンボリックリンクタイムスタンプのコピー/保存

シンボリックリンクタイムスタンプのコピー/保存

私はGNU / Linuxシステムでいくつかのプロジェクトを進めており、現在FreeBSDサーバーに保存されています。アーカイブからいくつかのディレクトリを再配置しましたが、現在、いくつかのシンボリックリンクが壊れていることがわかりました。このリンクは私の開発ラップトップには存在しますが、アーカイブにはないパスを指しています。したがって、これらのリンクは、ターゲットディレクトリがアーカイブされた新しい場所を指すようにしたいと思います。ファイル、ディレクトリ、シンボリックリンクのすべてのタイムスタンプを変更せずに維持したいと思います。

私の計画は次のとおりです。

ステップ1

touchを使用して、含まれているディレクトリのシンボリックリンクとタイムスタンプをコピーします。

$ touch -r . /tmp/timestamp-folder
$ touch -h -r ./symlink /tmp/timestamp-symlink

ステップ2

正しいパスでシンボリックリンクを削除して再作成します。

$ rm symlink
$ ln -s <correct-path> symlink

ステップ3

回復タイムスタンプ:

$ touch -h -r /tmp/timestamp-symlink symlink
$ touch -r /tmp/timestamp-folder .

残念ながら、これは機能しません。まず、touchターゲットが存在しない場合、シンボリックリンクのタイムスタンプの読み取りを拒否します。

$ touch -h -r symlink /tmp/timestamp-symlink
touch: symlink: No such file or directory

そのため、touchがシンボリックリンクを読むことができるように、欠落しているパス(ディレクトリ)を作成しました。今回はtouchエラーなしで実行されますが、生成されたファイルには/tmp/timestamp-symlinkシンボリックリンク自体のタイムスタンプではなく、シンボリックリンクが指すディレクトリのタイムスタンプがあります。

touch通常のファイルやディレクトリのように、シンボリックリンクに関連するタイムスタンプを読み、他のファイルに設定する方法はありますか?それ以外の場合、これを達成するために使用できる他のツールはありますか?

答え1

FreeBSDでは、GNUバージョンはパッケージにtouchあります。sysutils/coreutils

$ sudo pkg install sysutils/coreutils

パッケージをインストールした後は、にある必要がありますgtouch/usr/local/binこのPATHディレクトリがまだない場合は、ディレクトリに追加します。

$ ls -l $(which gtouch)
-r-xr-xr-x  1 root  wheel  133144 Apr  6 18:19 /usr/local/bin/gtouch

私のテストによると、事前に/tmp/timestamp-*ファイルを生成することに関するあなたの意見は正確でした。それ以外の場合は、コードで代わりに in を使用するのがうまくいくようgtouchです。次の例が役に立ちます。touch

gtouch /tmp/timestamp-folder /tmp/timestamp-symlink

gtouch -r . /tmp/timestamp-folder
gtouch -h -r ./symlink /tmp/timestamp-symlink

# Remove and recreate the symbolic link with the correct path:

rm symlink
ln -s <correct-path> symlink

# Restore timestamps:

gtouch -h -r /tmp/timestamp-symlink symlink
gtouch -r /tmp/timestamp-folder .

関連情報