我创建了一个脚本,它将文件名拆分为数据库插入的组件:
find . -name "R*VER" | while read fname
do
awk -v squote="'" -v base=${fname##*/} '
{
split( base, a, "~" );
printf( "INSERT INTO REPORT (COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8)\n" );
str = sprintf( "VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")", base, a[1], a[2], a[3], a[7], a[8], a[9], a[10] );
gsub( "\"", squote, str ); # replace double quotes with singles
print str;
}'
done
直到今天仍然很有效。引入了新文件名a[1]
包含空格,例如something here~...
。
现在,我有一堆看起来像这样的文件:
R1~blah~blahblah...VER
和
R 4~blah~blahblah...VER
我想将find
从find . -name "R*VER"
修改为find . -name "* *"
,但这将排除文件名中没有空格的所有文件。
最有效的方法是什么?
答案 0 :(得分:2)
将Internal Field Separtor variable, $IFS设置为换行符,而不是空格。例如:
#!/bin/sh
filenames=`ls`
IFS=$'\n'
for fname in $filenames ; do
echo "$fname: "
awk '{print $0}' $fname
done
答案 1 :(得分:0)
如何将变量包含在命令行中,如:
awk ... base="$fname"
但是,不知道代码中的其他##*/
是什么。也许一些bash扩展......
如果您确定没问题,请将它全部用双引号括起来:
base="${fname##*/}"