處理檔名中的空格
阿新 • • 發佈:2019-01-24
方法一:
方法一有一個缺陷就是目前不能直接在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 "\*"