쉘 스크립트에서 동일한 파일 이름을 가진 여러 파일을 로드해야 하지만 각 파일 이름 앞에 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)
필요한 경우 원래 요청의 반대(대문자)를 수행하십시오 ).O
n
o
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
.
보다 일반적으로는 압축되지 않은 버전의 파일을 디스크에 저장할 필요가 거의 없습니다. 즉시 압축을 풀고 동시에 이를 사용하는 모든 응용 프로그램에서 사용할 수 있도록 하는 것이 좋습니다.
소비자 애플리케이션이 데이터를 순차적으로 읽지 않는 경우(그렇다면 여기서는 놀랄 것임) 디스크에서 압축을 풀면 됩니다( =(...)
위의 방법처럼 임시 파일에서 출력 가져오기)) gunzip
SQL) .
태그에서 알 수 있듯이 (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을 선택했습니다.