동적 파일 이름을 기반으로 파일을 압축하고 싶습니다. 내 파일 이름은: ClientNames
CODE, Client Name
1111, ABC
1231, XYZ
1211, APT
1561, OPT
내 파일 이름은 MAA.TRD.1111.2016.20.09.csv(파일명.코드.연도.날짜.월.csv) 디렉터리에 서로 다른 코드를 가진 여러 파일이 있습니다.
코드를 확인해야 할 때마다 ClientNames 파일에서 클라이언트 이름을 가져오고 이름으로 파일을 압축합니다. - (파일 이름: MAA.TRD.1111.2016.20.09.csv zip 파일 이름: ABC.20162009.csv; MAA.TRD . 1211.2016 .20.09.csv zip 파일 이름은 APT.20162009.csv 등이어야 합니다.)
파일을 하나씩 넣고 압축하고 이름을 바꾸는 루프를 디자인하고 싶습니다.
내 코드는 다음과 같습니다
FILES=MAA.TRD*.csv
for file in ${FILES}
do
ls -lrt MAA.TRD*.csv | cut -d '.' -f 3 > $SCRIPT/LogfileCODE
cd $SCRIPT
DATE=`date`
Filename=`grep -Fwf $LogfileCODE $ClientNames | cut -d ',' -f 2`
ZIPFILENAME="${Filename}_${DATE}"
echo " Zipping of file is starting "
zip -j ${ZIPFILENAME}-$DATE.zip $file
done
하지만 내 for 루프는 모든 파일을 하나로 묶습니다. 도와주세요.
답변1
1 DATE=$(date '+%Y%m%d')
2
3 for FILE in MAA.TRD*.csv
4 do
5 CODE=$(echo $FILE | cut -d. -f3)
6 CLIENT=$(grep -w $CODE ClientNames | sed 's/^.*, //')
7 NEWFILE=$CLIENT.$DATE.csv
8 mv $FILE $NEWFILE
9 echo " Zipping of $NEWFILE is starting "
10 zip -j $NEWFILE.zip $NEWFILE
11 done
1 - 공백이 없는 형식으로 날짜를 설정하고 원하는 대로 자유롭게 조정하세요.
3 - 간단히 디렉터리의 모든 파일을 반복합니다. (이렇게 하면 설명된 명명 규칙과 일치하는 모든 파일로 확장됩니다.)
5 - 파일 이름에서 코드 가져오기
6 - 현재 파일의 코드를 기반으로 ClientNames에서 CLIENT를 가져옵니다(쉼표 뒤의 공백을 제거하는 것을 포함하여 여기에서 sed를 사용합니다. cut -d, -f2
실제로 공백이 없어도 괜찮습니다). 이는 ClientNames가 CWD에 있다고 가정합니다. 필요한 경우 경로
7 - 나중에 다시 사용할 수 있도록 새 파일 이름 구성
8 - 파일 이름을 새 이름으로 바꿉니다.
10 - Zip 파일(zip 파일이 .csv로 끝나는 것을 원하지 않음)