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

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

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

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)

관련 정보