파일을 순차적으로 로드

파일을 순차적으로 로드

쉘 스크립트에서 동일한 파일 이름을 가진 여러 파일을 로드해야 하지만 각 파일 이름 앞에 YYMMDDPERSONNEL을 추가해야 합니다. 예: 231102PERSONNEL 및 230103PERSONNEL 동일한 디렉토리에 다른 파일이 많이 있으므로 정렬 시 파일 이름이 중요합니다. 로드할 파일을 오래된 것부터 최신 것 순으로 정렬해야 합니다.

현재 내가 가지고 있는 것은 한 번에 하나의 파일만 처리하도록 설계되었습니다.

답변1

이것은 파이프를 사용한 간단한 작업입니다.

find . -maxdepth 1 -type f -name '*PERSONNEL.gz' -print | \
    sed -e 's%^./%%' | \
    sort | \
    xargs -r /bin/echo 

man페이지를 읽어보세요 .

간단한 개요는 다음과 같습니다.

  • find파일 이름 목록 인쇄STDOUT
  • sed좀 더 보기 좋게 만들어 ( ./231102PERSONNEL.gz로 변경 231102PERSONNEL.gz)
  • sort목록을 정렬합니다.
  • xargs가능한 한 많은 파일을 배치합니다( xargs --show-limits </dev/null참조당신의제한) 목록의 나머지 부분에 대해 "명령"을 반복합니다.
  • /bin/echo자리 표시자입니다.

답변2

기본적으로 쉘 전역은 어휘적으로 확장되며, 귀하의 경우 어휘 순서는 연대순(순서대로) 파일은 모두 같은 세기에 속해야 합니다(예: 20 세기가 실제로 1901년부터 2000년까지라는 점을 무시하고 1900년부터 1999년까지).

그리고 zsh:

set -o extendedglob
for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) gunzip < $f | your-sql-loader

(또는 동일한 순서로 파일이 [0-9](#c6)PERSONNEL.sql.gz(NOn)필요한 경우 원래 요청의 반대(대문자)를 수행하십시오 ).Ono

your-sql-loader표준 입력에서 입력을 얻을 수 있다고 가정합니다 . 파일 이름 매개변수로 전달해야 하는 경우:

for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) your-sql-loader <(gunzip < $f)

또는 filename 인수가 일반 파일이어야 하는 경우:

for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) your-sql-loader =(gunzip < $f)

당신은 아마도 다음을 할 수 있을 것입니다:

gunzip -dc -- [0-9](#c6)PERSONNEL.sql.gz | your-sql-loader

즉, 역정렬된 모든 파일의 압축되지 않은 모든 내용을 연결합니다 your-sql-loader.

보다 일반적으로는 압축되지 않은 버전의 파일을 디스크에 저장할 필요가 거의 없습니다. 즉시 압축을 풀고 동시에 이를 사용하는 모든 응용 프로그램에서 사용할 수 있도록 하는 것이 좋습니다.

소비자 애플리케이션이 데이터를 순차적으로 읽지 않는 경우(그렇다면 여기서는 놀랄 것임) 디스크에서 압축을 풀면 됩니다( =(...)위의 방법처럼 임시 파일에서 출력 가져오기)) gunzipSQL) .

태그에서 알 수 있듯이 (t)csh를 사용해야 한다면(이 세기에는 매우 놀라운 일이 될 것입니다. 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면) 다음과 같습니다.

gunzip -dc -- "`ls -rd -- [0-9][0-9][01][0-9][0-3][0-9]PERSONNEL.sql.gz`" | your-sql-loader

여기서 ls -r파일은 이름을 기준으로 역순으로 정렬됩니다. 해당 "`...`"출력은 검색되어 공백이 아닌 줄 구성 요소로 구분됩니다.

6자리 숫자를 일치시키는 데 해당하는 zsh 또는 ksh가 csh없기 때문에 각 숫자를 구체적으로 일치시키고 월 및 일 숫자를 보다 엄격하게 일치시킬 수 있는 기회를 얻습니다.[0-9](#c6){6}([0123456789])

oe[code]지난 세기의 파일이 있는 경우 o+function또는 glob 한정자를 사용하여 zsh에서 사용자 정의 정렬 순서를 정의할 수 있습니다.

[0-9](#c6)PERSONNEL.sql.gz(Noe['REPLY[1,0]=$(( 19 + ($REPLY[1,2] < 70) )'])

즉, 처음 두 자리 숫자가 70보다 크거나 작은 숫자인지 여부에 따라 파일 이름 앞에 20 또는 19를 추가하여 glob을 정렬하도록 zsh에 지시합니다(실제 데이터 세트 연도에 따라 컷오프를 조정해야 합니다). ; 여기서는 Unix 시대의 시작인 1970을 선택했습니다.

관련 정보