我有遗留系统生成的大量文件,而且要求将文件重命名为长描述(业务用户可以理解)。
示例文件名:bususrapp.O16200.L1686.1201201304590298
RptList:bususrapp Billing file for app user
当系统生成文件' bususrapp'文件,这将被翻译为“用户”的“结算文件”。最终的输出需要 类似" app app的结算文件.1201201304590298.txt "
for i in `ls * `; do j=`grep $i /tmp/Rptlist | awk '{print $2 $3 $4 $5} ;'` mv $i $j; done
示例文件中的最后一个限定符是我的日期和时间戳。我需要剪切/复制并将其附加到新的长描述文件名。 " 应用用户的结算文件.1201201304590298.txt "
请建议如何实现这一点。
答案 0 :(得分:2)
给你的输入文件,这个awk会产生你想要的输出文件名:
echo "bususrapp.O16200.L1686.1201201304590298 RptList: bususrapp Billing file for app user" | awk -F"[.]| RptList| bususrapp " '{print $NF"." $4 ".txt"}'
Billing file for app user.1201201304590298.txt
使用FS
执行所有艰苦工作,然后按指定的顺序打印字段。
这是一个更完整的答案:
# use find instead of ls, pointing to files only
find /tmp/Rptlist -name "bususrapp*" -type f -print |
awk -F/ '
{
# rebuild the path which was split up by FS
for(i=1;i<NF;i++) path = path $i"/"
fname=$NF
# split up the file name for recombination
c=split(fname, a, "[.]| RptList:| bususrapp ")
# output 2 arguments the "/original/file/path" "/new/file/path"
printf( "\"%s%s\" \"%s%s.%s.txt\"\n", path, fname, path, a[c], a[4] )
path=""
}' |
# use xargs to feed those two arguments to mv for the copy
xargs -n2 mv
只是一种不同的风格。 @EtanReisner的回答更清晰。因为我不用bash编写脚本,所以我会尝试这样做。
答案 1 :(得分:2)
我相信以下内容会做你想要的。
for file in *; do
# Drop everything up to the last .
stamp=${fname##*.};
# Drop everything after the first period.
name=${fname%%.*}
# Find the matching line in RptList.
line=$(grep "$name" RptList)
# Drop the first (space separated) field.
line=${line#* }
outfile="$line.$stamp.txt"
mv $file $outfile;
done