시간순으로 정렬 된 디렉토리에 100 개의 첫 파일을 나열하는 가장 좋은 방법


12

생성 된 타임 스탬프 (가장 오래된 것)별로 정렬 된 디렉토리에 100 개의 첫 번째 파일을 나열하는 가장 좋은 방법은 무엇입니까? 디렉토리는 꽤 큽니다 (약 100000 개 파일).

LS는 에 파이프 헤드가 완료 끔찍한 시간이 오래 걸립니다.

편집하다:

  • 파일 시스템은 ext3입니다.
  • 드물게 "정리"작업을 수행하고 타사 소프트웨어가 파일을 생성하므로 폴더의 파일 수를 제한하는 것은 노력할 가치가 없습니다.
  • 작성 시간 대신 파일 수정 시간을 사용하면 수용 가능한 솔루션이 제공됩니다.


1
정리 작업 인 find -mtime +<number of days> -delete경우 특정 연령보다 오래된 모든 파일을 정리하는 것이 좋습니다. 즉, 정렬이 필요하지 않습니다.
Mikel

답변:


14

당신은 " 머리에 파이프 ls 완료하는 데 시간이 오래 걸린다"고 말합니다.

이 원인은 ls디렉토리 가 아닌 디렉토리의 파일 수입니다. 단일 디렉토리에 100,000 개의 파일이있는 경우이 문제를 해결하려면 100,000 개 파일 모두에 대한 정보를 가져 와서 정렬하거나 출력을 인쇄해야합니다.

시간이 너무 오래 걸리면 실제 해결책은 파일을 여러 디렉토리로 분할하는 것입니다.

여러 디렉토리에 파일을 분산시킬 수없는 경우 고려할 파일 수를 좁힐 수있는 방법이 있습니까? 예를 들어 파일 이름에 날짜가 포함되어 있으면 시스템에서 100,000 개의 파일을 정렬 할 필요가 없도록 와일드 카드를 포함시킬 수 있습니다. 아니면 순차적으로 번호가 매겨 졌습니까? (이것은 도움이 될 수도 있고 아닐 수도 있지만 시도해 볼 가치가 있습니다.)

이 작업을 몇 번이나 시도하고 있습니까? 아마도 재사용을 위해 출력을 저장 / 캐싱 할 가치가 있습니다 .


이제 질문이 있습니다.

당신이 있습니까 있는지 당신은 "생성 시간"이 아닌 "변화의 시간"을 의미 ? 대부분의 도구는 "생성 시간"이 아닌 "변경 시간"만 표시 할 수 있습니다.

"생성 시간"을 얻는 것은 매우 새로운 일이며, ext4 파일 시스템과 설치하기 쉽지 않은 일부 도구가 필요합니다.


시간을 바꾸고 싶다면

변경 시간 (짧은 시간)은 파일의 속성이 마지막으로 변경된 시간을 의미합니다.

ls -c ctime을 기준으로 정렬합니다.

내림차순이 아닌 오름차순으로 출력을 원하므로 -r옵션을 사용 하여 출력을 반전시켜야합니다 .

따라서 다음과 같이 할 수 있습니다.

ls -cr | head -n 100

다음을 사용하여 동일한 문제에 대한 더 긴 해결책 stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

그러나 그것은 ls -cr내 시스템 보다 느리게 실행됩니다 .


수정 시간을 원한다면

수정 시간 (mtime for short)은 파일 내용이 마지막으로 변경된 시간을 의미합니다.

ls -t mtime을 기준으로 정렬합니다.

변경 ls -cr에 대한 ls -tr(최고의 옵션) 또는 변경 stat -c $'%Z\t%n'stat -c $'%Y\t%n'.


생성 시간이 필요한 경우

(짧은 시간)

이것은 더 어렵다.

먼저, 디렉토리가를 사용하여 포맷 된 파일 시스템에 있는지 확인하십시오 ext4. tune2fs -l <device name>이를 확인 하는 데 사용할 수 있습니다 .

그런 다음 여기에 도움 이되는 새로운 stat형식 %W이 있습니다. 이를 얻으려면 2010 년 10 월 이후에 릴리스 된 GNU Coreutils 버전을 다운로드하여 압축을 풀고 컴파일 한 후 설치해야합니다.

그런 다음 커널에 따라 작동 할 수도 있습니다 (시도하지 않았 음).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

또한보십시오:


에 대한 오류가 발생하면 "'$\t'

'$\t'표기가 필요 bash하거나 zsh: 그것은 작동하지 않습니다 dash또는 sh우분투. 당신이 정말로 그 껍질을 사용해야하는 경우, 당신은 어떤을 변경해야합니다 \tCtrl+ V, Tab및 주요한 제거 $단지 오프닝 인용 앞에서합니다.


그가 ext4를 실행하지 않았을 가능성이 있습니다. 모든 컴퓨터에서 Ubuntu 10.04를 실행하지만 여러 드라이브에서 JFS를 실행합니다. AFAIK JFS는 생성 타임 스탬프를 지원합니다.
jwernerny

과연. 우리는 그것이 ext3에서 지원되지 않고 ext4에서 지원된다는 것을 알고 있습니다. 빠른 검색은 zfs 또는 FreeBSD ufs와 함께 작동 할 수 있다고 제안하지만 Ubuntu에서는 공통점이 아닙니다! jfs 또는 xfs 또는 다른 것에 대해서는 확실하지 않습니다. 정보 / 링크를 찾을 수 있다면 더 많이들을 수있을 것입니다.
Mikel

매우 포괄적 인 답변과보다 구체적인 질문을 작성하기위한 미묘한 알림에 감사합니다.;) "찾기"가 성능 측면에서 승자로, fs-type이 ext3으로 밝혀졌습니다.

2

오늘 작업을 수행하는 다른 방법은 성능 문제와 관련이있을 수 있습니다.

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

이론적으로는 훨씬 더 빨리 출력을 시작해야하지만 지연이 어디서 발생하는지에 달려 있습니다. 그냥 복용 할 수 ls있는 파일을 분류하는 데 시간이 오래.


나는 그것을 의심한다. head충분한 입력을 읽 자마자 실제로 종료됩니다. time정면에서 둘 다를 실행하십시오 . head버전은 어쨌든 내 시스템에 훨씬 더 빠릅니다.
Mikel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.