2014-10-29 53 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