링크가 lnkfile
일반 참조 파일보다 오래된 것인지 확인하고 싶습니다 reffile
.
Bash test
에는 링크 역참조 기능이 내장되어 있으므로 test lnkfile -ot reffile
비교 대상은 lnkfile
링크 자체가 아닙니다.
test
내장 함수가 심볼릭 링크를 따르지 않도록 하는 방법이 있습니까 ? 그렇지 않으면 심볼릭 링크 시간을 어떻게 비교할 수 있습니까?
답변1
사용할 수 있는 방법은 없지만 test
사용할 수는 있습니다 find
.
test "$(find reffile -prune -newer lnkfile)" && command
여기서는 이전에 출력이 반환됩니다 find
. 와 동일한 옵션은 없습니다. 이는 문자열 길이가 0이 아닌 경우에 해당됩니다. 따라서 출력이 있으면 실행하십시오.lnkfile
reffile
test
test -n
find
command
댓글에서 이 솔루션을 다른 솔루션과 비교해 달라는 요청을 받았습니다.stat
. 우선 저는 이 stat
방법이 매우 좋다고 생각했습니다.
비교를 위해 벤치마크 테스트를 해봤습니다. 나는 테스트를 여러 번 반복하여 비슷한 결과를 얻었습니다.
$ time (for i in {1..1000}; do test "$(stat --format=%Z a)" -lt "$(stat --format=%Z b)" && echo foo > /dev/null ; done)
================
CPU 101%
CPU 104%
user 1.264
system 0.942
total 2.108
$ time (for i in {1..1000}; do test "$(find b -newer a)" && echo foo > /dev/null ; done)
================
CPU 104%
user 0.693
system 0.526
total 1.164
나에게는 거의 두 배 빠른 것 같은데 find
, 아마도 두 개가 아닌 하나의 프로세스이기 때문일까요 stats
? 어떻게 비교해야 할지 모르겠습니다. 다른 관련 측면이 생각나시면 댓글을 남겨주세요.
아래 Stéphane Chazelas의 의견에 따르면 몇 가지 다른 차이점이 있습니다.
다른 차이점은 다음과 같습니다.
find
하나는 표준입니다.stat
GNU 구현이 필요합니다 .stat
이stat
방법은 동일한 초 내에 수정된 파일에는 작동하지 않습니다(그러나find
타임스탬프의 1초 미만 단위를 지원하는 시스템에서는 작동해야 합니다). 임의의 파일 이름은 지원 되지도 않습니다find
.stat
파일 중 하나를
stat()
편집할 수 없는 경우 다른 차이점을 발견할 수 있습니다.
답변2
내가 아는 한, bash는 -ot
심볼릭 링크 역참조 등을 방지하는 버전을 제공하지 않습니다.
당신이 할 수 있는 일은 GNU 통계(심볼릭 링크가 없는 경우 역참조하지 않음 -L
)를 사용하고 mtime 에포크를 수치적으로 비교하는 것입니다.
if (( "$(stat --format=%Z lnkfile)" < "$(stat --format=%Z reffile)" )); then
# lnkfile is older
fi
답변3
버전 5.6 이상(나노초 정밀도의 경우) 에서는 zsh
내장 함수를 통해서만 이 작업을 수행할 수 있습니다.
zmodload zsh/stat
if
stat -LA lnktime -F '%021s%N' +mtime -- $lnkfile &&
stat -A reftime -F '%021s%N' +mtime -- $reffile &&
[[ $lnktime < $reftime ]]
then
print -r -- $lnkfile is older than $reffile
fi
파일 이름에 포함된 문자 또는 비문자에 관계없이 작동하며 타임스탬프를 나노초까지 비교합니다.
GNU/Linux를 실행하는 x86_64 PC의 일반적인 배정밀도 부동 소수점은 적어도 충분하지 않기 때문에 타임스탬프를 부동 소수점이 아닌 문자열(십진수 문자열 표현으로 나노초, 0부터 30자리까지 채워짐)로 비교합니다. 정확한 저장 개수는 다음과 같습니다. 1548195897.775033155
따라서 동일한 100나노초 안에 오늘 수정된 두 파일 사이의 차이점을 알 수 없습니다.
$ ((1548195897.775033155 < 1548195897.775033255)) && echo yes
$ [[ 1548195897775033155 < 1548195897775033255 ]] && echo yes
yes