동일한 접두사가 있는 디렉터리(cdr12345.csz, cdr32342.csv, cdr 98876.csv 등)에서 가장 오래된 100개 파일을 가져오고 파일에 저장된 이 100개 파일의 이름을 나열하는 방법이 있는지 알고 싶습니다. .txt를 나중에 읽고 100개 파일을 압축할 수 있습니다. 한 번에 100개만 할 수 있는데 어떻게 가장 빠른 100개를 먼저 얻을 수 있나요? zip 파일의 크기는 500mgb 미만이어야 합니다.
답변1
가장 오래된 100개 파일을 식별하는 측면에서 다음을 수행할 수 있습니다.
ls -1tr /path/to/directory/cdr* | head -n100 > filelist.txt
한 줄에 하나의 파일을 나열 -1
하고(여기서는 반드시 필요하지 않음) -t
수정 시간을 기준으로 최신 항목부터 정렬하고 -r
정렬 순서를 반대로 합니다(즉, 최신 항목을 마지막에 나열합니다). 출력 파이프에는 head -n100
처음 100줄(즉, 가장 오래된 100개 파일)이 나열됩니다. 그런 다음 출력을 filelist.txt
가장 오래된 100개의 파일 이름이 포함된 파일로 리디렉션했습니다.
그런 다음 다음을 사용하여 이러한 파일을 압축할 수 있습니다.
zip backup -@ < filelist.txt
이 옵션은 표준 입력에서 파일 이름을 읽도록 지시 하고 리디렉션은 파일의 목록을 제공합니다 backup.zip
.filelist.txt
-@
zip
이 정도 테스트를 거쳐 요구 사항을 충족하는지 확인한 후에는 다음 파일을 삭제할 수 있습니다 filelist.txt
.
xargs rm < filelist.txt
그러면 다음이 남게 됩니다:
filelist.txt
가장 오래된 파일 목록backup.zip
가장 오래된 파일의 내용
이는 500MB 파일 크기 제한을 해결하지 못합니다. 한 가지 방법은 zip 파일을 생성한 후 크기를 확인하고 너무 크면 아카이브에 포함되는 파일 수를 줄이는 것입니다.
답변2
파일 이름을 저장하고 재분석하는 것은 까다로울 수 있지만 파일 이름에 공백이나 줄 바꿈이 포함되어 있지 않으면 덜 조심스럽게 처리할 수 있습니다. 파일 이름이 직접적으로 구문 분석되지 않는 zsh를 사용하는 접근 방식을 보여 드리겠습니다.
파일 이름을 배열로 수집합니다.
files=( cdr*.csv(om[-100,-1]) )
이는 cdr
으로 시작하고 끝나는 파일 이름을 일치 .csv
시키되 o
수정 시간을 기준으로 파일을 정렬하고 가장 오래된 100개만 선택하는 것을 의미합니다.
다음과 같은 다양한 방법으로 파일로 인쇄할 수 있습니다.
print -l $files > filelist.txt
printf 'File: %s\n' $files
이러한 파일의 zip 파일을 생성하려면 다음을 수행하십시오.
zip zipfile $files
...각 인스턴스에서 zsh는 $files
변수를 각 요소로 바꿉니다. 동일한 확장을 수행하는 보다 신중한 방법은 ${files[@]}
대체를 사용하는 것입니다.
답변3
주문하다
ls -1tr | head -n 100
디렉토리에서 가장 오래된 100개의 파일 목록이 제공됩니다.
이 출력을 파일(예: zip.in)로 저장할 수 있습니다. 그런 다음 이 파일을 사용하여 zip 파일을 만들 수 있습니다. 예를 들어:
zip zipfile.zip $(cat zip.in)
zip 파일이 500MB보다 작아야 하는 경우 개별 파일의 총 크기를 계산하여 500MB를 초과하는지 확인할 수 있습니다. 그러나 zip이 일부 압축을 수행하므로 이는 정확하지 않습니다. zip 파일을 생성한 후에만 알 수 있습니다.
zip.in 목록의 각 파일을 한 번에 하나씩 zipfile.zip에 추가할 수 있습니다. 각 파일을 추가한 후 zipfile.zip의 크기를 확인하여 500MB를 초과하는지 확인할 수 있습니다.