私は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 .