MAC OSX/Bash 문제 - 날짜별로 문자열 정렬

MAC OSX/Bash 문제 - 날짜별로 문자열 정렬

CSV 파일로 파일 출력이 있는데 날짜 시간별로 정렬하고 싶은데 날짜 시간이 아래와 같이 표시되고 시간과 연도가 다른 순서로 표시됩니다.

파일 목록을 생성하려면 다음 명령을 사용하십시오.

find /Volumes/myVolume  -type f -exec  ls -1 -aldT {} \; |cut -c35-300 |sort  -r -k5,5 -s |sort -k3,3 -s

1579099156  6 Apr 09:33:03 2023 /Volumes/myvolume/myfile

sort명령은 작동하지만 두 번째 정렬 필드가 "월"이므로 알파순으로 정렬하는 반면, 나는 이를 월로 처리하여 월순으로 정렬하고 싶습니다. (예: 1월, 2월, 3월 등).

파일 목록이 생성되는 방식을 변경하지 않고 이를 달성할 수 있는 방법이 있습니까?

필요한 경우 파일 목록을 수정할 수 있으며, 이는 다른 작업을 수행하기 위해 구문 분석할 수 있는 파일 출력의 재귀 목록을 생성하는 데 도움이 됩니다.

필드 순서를 조정할 수 있지만 모든 필드가 표시되고 파일 이름이 항상 마지막에 표시되어야 합니다.

답변1

zshOSX에서는 glob 한정자를 사용하여 수정 시간별로 일치하는 파일 이름을 정렬할 수 있는 액세스 권한이 있어야 합니다.

/Volumes/myVolume/**/*(.DOm)

zstat그런 다음 다음에 설명된 것과 유사한 방식으로 해당 모듈을 사용할 수 있습니다.각 파일의 크기와 함께 텍스트 파일 목록에 저장됩니다.크기와 실행 시간을 가져와 인쇄합니다. 그래서 (방법을 직접 조정하십시오)

zmodload -F zsh/stat b:zstat

zstat -F '%d %b %T %Y' -A data -n /Volumes/myVolume/**/*(.DOm)
for name _ _ _ _ _ _ _ size _ mtime _ _ _ in $data; do 
  printf '%s\t%s\t%s\n' $size $mtime $name
done

또는 명시적인 루프를 사용하십시오(가독성이 더 높을 수도 있음).

zmodload -F zsh/stat b:zstat

for f in  /Volumes/myVolume/**/*(.NDOm); do
  zstat -LF '%d %b %T %Y' -H s -- $f &&
    printf '%s\t%s\t%s\n' $s[size] $s[mtime] $f
done

답변2

ls날짜별로 파일을 정렬하는 기능이 있습니다.

  ls -l[r]t

따라서 "역방향"으로 작업할 수 있습니다. ls먼저 파일 목록을 사용한 다음 정렬하는 대신 파일 목록을 먼저 준비한 다음 정렬합니다 ls.

  ls -lrt $(find /start/dir -type f -print)

ls필요에 맞게 옵션을 변경하십시오. 단, 시간순으로 정렬하려면 "t"를 포함해야 합니다(역순 정렬을 나타내려면 "r"도 가능).

답변3

날짜는 무서운 것이며 그 구조는 다양합니다. Epoch 시간을 사용할 수 있나요? 쉽게 정렬할 수 있는 간단한 숫자입니다. 또한 이렇게 하면 명령의 이식성이 향상됩니다.

find exec 매개변수로 바꿔보세요.

ls -1 -D "+%s" -alT

예:

user@host ~ % ls -1 -D "+%s" -alT minicom.log
-rw-r--r--  1 user  group  35 +1683075462 minicom.log
user@hose ~ % ls -1alT minicom.log
-rw-r--r--  1 user  group  35  3 May 12:57:42 2023 minicom.log

에포크 시간을 취하여 1683075462다음과 같이 변환 하면date

user@host ~ % date -r 1683075462
Wed  3 May 2023 12:57:42 NZST

Background, epoch/epoc 시간은 유닉스 시간이라고도 하며 "1970년 1월 1일 00:00 이후의 초 수"를 의미합니다.

관련 정보