
動的ファイル名に基づいてファイルを圧縮したいと思います。私のファイル名は: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
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で終わることを望まない)