심볼릭 링크 타임스탬프 복사/보존

심볼릭 링크 타임스탬프 복사/보존

저는 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/binPATH디렉토리가 아직 없으면 디렉토리에 추가하십시오.

$ 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 .

관련 정보