저는 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 .