이것은 스스로 대답한 질문이므로 다른 사람들도 유용하다고 생각할 수 있습니다.
Dolphin에서는 이름별 정렬과 수정된 날짜별 정렬 사이를 전환하는 경우가 있습니다. 그러나 Dolphin은 내가 있는 폴더의 순서만 변경하는 것이 아니기 때문에 이것이 짜증스러울 수 있습니다. 그것은 모든 것을 변화시킵니다. 그래서 돌핀에서 이름과 날짜를 전환할 때 특정 디렉터리가 영향을 받지 않도록 수정된 날짜를 이름 순서에 맞게 수정하는 방법이 궁금합니다.
답변1
그것은 매우 간단하다는 것이 밝혀졌습니다.
for FILE in *; do touch -- "$FILE"; sleep 0.001; done # sort
재귀적으로 수행하려면 다음을 수행하십시오.
for FILE in **/*; do touch -- "$FILE"; sleep 0.001; done # sort
이것은 # sort
단지 의견입니다. 목적은 명령을 거꾸로 검색하는 것을 용이하게 하는 것입니다.
답변2
당신의 방법 (특히sleep 0.001
통화 전 통화 추가)는 1초 미만의 정밀도를 갖는 타임스탬프가 있는 시스템 및 파일 시스템에서만 작동하며, 심지어 ext4 파일 시스템이 있는 Linux와 같은 일부 시스템 및 파일 시스템에서는 타임스탬프에 나노초 해상도가 있더라도 이러한 파일 배치에는 동일한 정밀도 타임스탬프(참조linux: 터치 날짜 정밀도그리고Linux의 파일 시스템 시간이 항상 시스템 시간보다 몇 밀리초 느린 이유는 무엇입니까?더 알아보기).
금후:
for f ({1..20}) touch $f
$ ls --full-time -lrt
total 0
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.183520078 +0100 2
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.183520078 +0100 1
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.187520223 +0100 3
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.191520368 +0100 6
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.191520368 +0100 5
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.191520368 +0100 4
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.195520512 +0100 8
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.195520512 +0100 7
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.199520657 +0100 9
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.199520657 +0100 10
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.203520802 +0100 13
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.203520802 +0100 12
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.203520802 +0100 11
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.207520947 +0100 15
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.207520947 +0100 14
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.211521092 +0100 17
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.211521092 +0100 16
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.215521237 +0100 19
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.215521237 +0100 18
-rw-r--r-- 1 chazelas chazelas 0 2023-06-26 07:41:04.219521381 +0100 20
( 위의 타임스탬프에서 볼 수 있듯이 sleep 0.001
도움이 되지 않을 수도 있습니다 touch
. 내 시스템에서 실행하는 데 1ms 이상이 걸렸습니다.)
더 나은 점은 touch -d '0.000000001 second ago'
(GNU 가정 touch
):
$ strace -qqe /utime touch -d now a
utimensat(0, NULL, NULL, 0) = 0
$ strace -qqe /utime touch -d '0.000000001 second ago' a
utimensat(0, NULL, [{tv_sec=1687765504, tv_nsec=213757695} /* 2023-06-26T08:45:04.213757695+0100 */, {tv_sec=1687765504, tv_nsec=213757695} /* 2023-06-26T08:45:04.213757695+0100 */], 0) = 0
명시적인 타임스탬프가 요청되는 경우 touch
이는 시스템이 현재 캐시된 fs 시간을 선택하도록 하는 대신 시스템에 대한 전체 정밀도 클록 시간 요청을 사용하여 계산되므로 두 후속 호출이 서로 다른 타임스탬프를 얻게 된다는 것이 거의 보장됩니다. 타임스탬프가 1초 미만의 정밀도를 지원하지 않는 경우에는 여전히 작동하지 않습니다.
zsh를 사용하고 touch
GNU와 호환되는 경우 다음을 수행할 수 있습니다.
zmodload zsh/datetime
now=$EPOCHSECONDS
for file ( *(NOn) ) touch -d @$((now--)) -- $file
또는 표준을 사용하십시오 touch
.
zmodload zsh/datetime
now=$EPOCHSECONDS
for file ( *(NOn) ) {
TZ=UTC0 strftime -s t %Y%m%d%H%M.%S $((now--)) &&
TZ=UTC0 touch -t $t -- $file
}
$EPOCHSECONDS
현재 Unix 시대 시간은 어디에 있습니까? *(NOn)
유사 *
하지만 N
ULLGLOB가 활성화되어 있고 파일이 역방향(대문자 O 역방향) O
으로 정렬되어 있으므로 . 그런 다음 타임스탬프를 1초 간격으로 설정하여 시간을 거슬러 올라갑니다.n
ls -r
답변3
다른 사람들이 이미 말했듯 ls
이 (echo) *
순서가 다릅니다.
ls
정렬 (또는 ls -[some option]
정렬)을 원할 경우 ls -r
간단히 대신 이것을 사용할 수 있습니다 *
.
또한 "*"는 (큰 디렉터리에서) 결과 명령줄이 줄 길이 제한을 초과하게 만들 수 있는 모든 파일 이름 목록으로 확장되므로 본질적으로 안전하지 않습니다. 쉘(쉘, 버전에 따라 다름)은 "명령줄이 너무 깁니다"와 같은 오류로 응답합니다.
마지막으로 한 가지 말씀드리면, 쉘 변수 이름을 대문자로 지정하지 않는 것이 안전한 습관입니다. 시스템 변수(예: "PATH", "SHELL", "OPTARG" 등)는 일반적으로 대문자로 표시되며, 자신의 변수 이름을 같은 방식으로 지정하면 해당 변수를 설정(해제)할 위험이 있습니다. 자신의 스크립트에 혼합(또는 소문자) 대소문자를 사용하면 안전합니다.
ls |\
while read fFile ; do
touch fFile
done