2014-10-29 22 views
1

我有幾個shell命令從給定的目錄中刪除所有的CSV。但是,當我嘗試將這些函數放入函數中時,它們似乎並不奏效,但我無法弄清楚原因。殼牌功能刪除CSV的不工作?

#works 
p=/path/* 
for f in $p 
do 
    if [ "${f: -3}" == 'csv' ] 
     then 
     rm $f 
    fi 
done 

#Doesn't work 
csv(){ 
t=$1 
for f in $t 
do 
    if [ "{f: -3}" == 'csv' ]; then 
    rm $f 
    fi 
done 
} 

x=/path/* 

#doesn't work 
csv $x 
+0

'$ 1'只會包含第一個文件名。試試't = $ @'。爲了這個工作,你的文件名不能有空格。最好是編寫你的循環,比如'for f;做......這將循環每個輸入。 – ooga 2014-10-29 18:40:28

+0

爲什麼不使用'find'命令? 'find/path/-maxdepth 1 -type f -name'* .csv'-delete'(或者沒有'-maxdepth 1' * by * recursive *) – 2014-10-29 18:44:33

回答

1

你需要改變:

if [ "{f: -3}" == 'csv' ]; then 

這樣:

if [ "${f: -3}" == 'csv' ]; then 

你的函數可以寫成這樣:

csv() { for f in $1; do [[ "${f: -3}" == 'csv' ]] && rm "$f"; done; } 

,並調用它的,注意左右的報價

x=/path/* 
csv "$x" 
1

猛砸擴展了您的變量引用之前解決的外殼函數調用。結果是每個與您的glob匹配的文件都成爲函數csv()的單獨參數,但該函數僅考慮第一個函數。這種變化應該工作:

csv(){ 
    for f in "[email protected]" 
    do 
    if [ "${f: -3}" == 'csv' ]; then 
    rm $f 
    fi 
    done 
} 
+0

請注意,這個版本打算在你的例子中被調用, *沒有*引用參數。它也適用於多個顯式參數。它也可以處理包含空格的文件名,如果你小心你的調用方式。 – 2014-10-29 18:48:21