생성 날짜별로 파일을 정렬하는 것보다 더 좋은 방법이 있습니까?

생성 날짜별로 파일을 정렬하는 것보다 더 좋은 방법이 있습니까?

생성 날짜별로 정렬된 디렉토리 목록을 표시해야 하는데 꽤 영리하다고 생각되는 이 코드 조각을 생각해 냈습니다. 내가 놓친 것보다 더 확실한 방법이 있습니까?

printf "%-20s\t\t\t%-s\n" "DATE" "CASE"
printf "%-20s\t\t\t%-s\n" "----" "----"

find $idir -mindepth 3 -maxdepth 3 -type d -printf "%T@ %Tc\t\t%p\n" \
     | sed "s#${idir}/##" \
     | sort -h \
     | sed "s#^[^ ]* ##"

샘플 출력

DATE                                    CASE
----                                    ----
Fri 06 Sep 2013 11:17:41 AM EDT         dir1/Baseline/2013_09_06_11_16_10
Fri 06 Sep 2013 01:44:38 PM EDT         dir2/Baseline/2013_09_06_13_42_48
Sun 08 Sep 2013 05:02:46 PM EDT         dir3/6 Month/2013_09_08_17_02_05
Fri 13 Sep 2013 02:28:30 PM EDT         dir4/Baseline/2013_09_13_14_25_09

세부 사항

위의 명령은 디렉토리에서 정확히 3개의 디렉토리를 찾습니다 $idir. 그런 다음 이 깊이에서 발견된 디렉터리의 생성 시간을 인쇄합니다. 그런 다음 $idir출력에서 ​​경로 부분을 제거하고(필요하지 않음) 정렬한 다음 %T@출력 부분을 잘라냅니다. 이는 출력을 더 쉽게 정렬할 수 있도록 하기 위한 것입니다.

후행이 없으면 sed출력은 다음과 같습니다.

DATE                                    CASE
----                                    ----
1378480661.2612650000 Fri 06 Sep 2013 11:17:41 AM EDT           dir1/Baseline/2013_09_06_11_16_10
1378489478.3223970000 Fri 06 Sep 2013 01:44:38 PM EDT           dir2/Baseline/2013_09_06_13_42_48
1378674166.7427782000 Sun 08 Sep 2013 05:02:46 PM EDT           dir3/6 Month/2013_09_08_17_02_05
1379096910.4431689000 Fri 13 Sep 2013 02:28:30 PM EDT           dir4/Baseline/2013_09_13_14_25_09

좀 더 깔끔한 방법을 보여주세요!

답변1

파일 시간별로 파일을 정렬하는 좋은 이식 가능한 방법은 없습니다. 가장 이식성이 뛰어난 방법은 다음과 같습니다.

  • 파일 이름에 인쇄 가능한 문자만 포함되어 있다고 가정할 수 있으면 를 호출하세요 ls -ltd.
  • 그렇지 않으면 Perl을 사용하십시오.

이는 GNU 도구를 사용하여 날짜별로 파일을 정렬하는 고전적인 방법입니다. 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다. 해당 옵션을 \n변경 \0하고 호출하면 sort이 문제를 쉽게 해결할 수 있습니다 -z. 아, 그리고 더 이상 당황하지 마세요 sed. sed가 문자를 특수 문자로 해석하기 때문에 $idir스크립트에 문자가 포함되어 있으면 작동하지 않습니다 .#*^$\[

cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p\0' |
sort -hz |
tr '\0\n' '\n\0' |
sed 's/^[^ ]* //'

그런데 생성 시간이 아닌 수정 시간을 기준으로 파일을 정렬하고 있습니다. OSX를 제외한 대부분의 UNIX 변형은 전체 생성 시간(파일 시스템에서 커널, 사용자 도구까지)을 지원하지 않습니다.

수정 시간별로 파일을 정렬하는 간단하고 깔끔한 방법은 zsh를 사용하는 것입니다. glob 한정자는 om나이에 따라 파일을 정렬합니다( Om가장 오래된 파일을 먼저 가져오는 데 사용됨).

files=(*(om))
echo "The oldest file is $files[-1]"

표시된 것과 같은 출력을 얻으려면 다음을 사용할 수 있습니다.zstat.

zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)

관련 정보