我正在嘗試為 AIX 系統和資料庫生成的審計日志創建一個檔案夾結構
以下是檔案夾中檔案的簡單示例:
ls -l /opt/audit/move/
輸出:
-rw-r--r-- 1 gl_user user 0 18 Aug 2019 test1.txt
-rw-r--r-- 1 gl_user user 0 06 Nov 18:55 test2.txt
上述 ls -l 命令的問題是第 8 列中的最近檔案顯示時間而不是年份。我可以使用 awk 和 for 回圈來獲取檔案的月份和年份,但這不是如上所示的選項
這個想法是在以下檔案夾結構中移動檔案:
# ls -l /opt/audit/2019/August/test1.txt
-rw-r--r-- 1 gl_user user 0 18 Aug 2019 test1.txt
# ls -l /opt/audit/2022/November/test2.txt
-rw-r--r-- 1 gl_user user 0 06 Nov 18:55 test2.txt
uj5u.com熱心網友回復:
ksh93使用(用于關聯陣列支持)的一個想法:
typeset -A months=( [Jan]="January" [Feb]="February" ) # OP can fill in the rest of the array
for fname in "${INFORLOG_BKP}"/move/*
do
read -r mon3 year < <(istat "${fname}" | awk '/Last modified:/{print $5,$6}')
tgtdir="${INFORLOG_BKP}/${year}/${months[$mon3]}"
mkdir -p "${tgtdir}" # '-p' also says to *not* print an error msg if dir already exists
mv "${fname}" "${tgtdir}"
done
uj5u.com熱心網友回復:
此方法涉及使用帶有 for 回圈的 isat 從上次修改日期獲取檔案的月份和年份。這確實有效,但我想知道是否有更好或更短的方法來實作我想要的:
INFORLOG_BKP="/opt/audit"
for i in `ls ${INFORLOG_BKP}/move`
do
FILE_MONTH=`istat ${INFORLOG_BKP}/move/$i | grep -w "Last modified:" | awk '{print $5}'`
FILE_YEAR=`istat ${INFORLOG_BKP}/move/$i | grep -w "Last modified:" | awk '{print $6}'`
case $FILE_MONTH
in
Jan) MONTH_STRING=January
;;
Feb) MONTH_STRING=February
;;
Mar) MONTH_STRING=March
;;
Apr) MONTH_STRING=April
;;
May) MONTH_STRING=May
;;
Jun) MONTH_STRING=June
;;
Jul) MONTH_STRING=July
;;
Aug) MONTH_STRING=August
;;
Sep) MONTH_STRING=September
;;
Oct) MONTH_STRING=October
;;
Nov) MONTH_STRING=November
;;
Dec) MONTH_STRING=December
;;
esac
#
# Create directory if it does not exist
#
[ -d ${INFORLOG_BKP}/${FILE_YEAR}/${MONTH_STRING}/ ] || mkdir -p ${INFORLOG_BKP}/${FILE_YEAR}/${ MONTH_STRING}/
mv ${INFORLOG_BKP}/move/$i ${INFORLOG_BKP}/${FILE_YEAR}/${MONTH_STRING}/
done
uj5u.com熱心網友回復:
sed 可以用來替代上面的 case 陳述句:
FILE_MONTH=`istat $i | grep -w "Last modified:" | awk '{print $5}' | sed 's/Jan/January/g' | sed 's/Feb/February/g' | sed 's/Mar/March/g' | sed 's/Apr/April/g' | sed 's/Jun/June/g' | sed 's/Jul/July/g' | sed 's/Aug/August/g' | sed 's/Sep/September/g' | sed 's/Oct/October/g' | sed 's/Nov/November/g' | sed 's/Dec/December/g'`
下面是完整的堆疊:
INFORLOG_BKP="/opt/audit"
for i in `ls ${INFORLOG_BKP}/move`
do
FILE_MONTH=`istat $i | grep -w "Last modified:" | awk '{print $5}' | sed 's/Jan/January/g' | sed 's/Feb/February/g' | sed 's/Mar/March/g' | sed 's/Apr/April/g' | sed 's/Jun/June/g' | sed 's/Jul/July/g' | sed 's/Aug/August/g' | sed 's/Sep/September/g' | sed 's/Oct/October/g' | sed 's/Nov/November/g' | sed 's/Dec/December/g'`
FILE_YEAR=`istat ${INFORLOG_BKP}/move/$i | grep -w "Last modified:" | awk '{print $6}'`
#
# Create directory if it does not exist
#
[ -d ${INFORLOG_BKP}/${FILE_YEAR}/${MONTH_STRING}/ ] || mkdir -p ${INFORLOG_BKP}/${FILE_YEAR}/${ MONTH_STRING}/
mv ${INFORLOG_BKP}/move/$i ${INFORLOG_BKP}/${FILE_YEAR}/${MONTH_STRING}/
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529003.html
下一篇:在附加列中替換日期
