方法一:
方法一有一个缺陷就是目前不能直接在shell脚本中处理问题,只能在终端命令行才可以,因为shell读入ls时用空格将各个文件名分开放入到数组,而文件名中本身含空格时,shell读入时会当做两个元素,所以在脚本中无法处理该问题
#将dir目录下面的所有文件名中的空格替换为下划线"_"
rename 's/ /_/g' dir/*
#将dir目录下面的所有文件名中的空格去掉
rename 's/ //g' dir/*
方法二:
方法二稍微复杂一些,需要对shell与awk之间如何传递参数进行深入了解
#思路:用awk取得ls -l命令的各字段,然后将文件名拼接起来
del_blank_in_filename()
{
#系统ubuntu14.04 desk,执行ls -l命令,用空格将输出分开之后总共9个字段,大于九个字段说明文件名中有空格,该程序只能处理文件名中含有一个空格的情况
ls -l $1 | awk -v cur_dir=$1 'NF>9 { print "mv "cur_dir"/"$9"\ "$10 " "cur_dir"/"$9$10}' | bash
}
#将当前目录下文件名中所含的空格删除
del_blank_in_filename $(pwd)
方法三:通用空格处理函数
#==============================================================
#参数1:要处理的目录,目录下含有带空格的文件名
#参数2:用什么字符来替换空格,像*之类对shell比较敏感的字符要加上反斜杠\*
#==============================================================
delete_names_blank()
{
ls -l | awk -v dir=$1 -v sp=$2 'NF>10 {
i=10;
src_file_name=$9;
dst_file_name=$9;
while(i<=NF){
dst_file_name=dst_file_name""sp""$i;
src_file_name=src_file_name"\ "$i;
i++;
}
print "mv "dir"/"src_file_name" "dir"/"dst_file_name;
}' | bash
}
#使用方法
delete_names_blank /home/dkos/test "\*"