2011-08-29 47 views
2

我试图做一个bash脚本这将焦油所有文件夹单独递归的文件夹。bash脚本焦油用空格

不过,我有一个问题,因为一些文件夹名称有空格等 所以它不能正常工作。

我有什么:

#!/bin/bash 
SAVEIFS=$IFS 
IFS=$(echo -en "\n\b") 
for i in $(ls ./2011) 
do 
    tar -zcvf "$i".tar.gz "$i" 
done 
IFS=$SAVEIFS 

但是出现例如问题:

tar -zcvf St Patricks Day Bar Night.tar.gz St Patricks Day Bar Night 

的空间会产生问题,有什么解决这个好办法?

回答

1
ls ./2011 | while read i 
do 
    echo tar -zcvf "$i.tar.gz" "$i" 
done 
+0

感谢之名换行,空格迷惑,这个工程。小心解释为什么循环必须采用这种格式? – Neutralise

+1

'对... in'总是在空间分割的东西,你不能围绕得到(甚至不'IFS')。但是'read'在\ n角色分裂了一些东西,这几乎是完美的(除非你真的在你的文件名中有\ n,在这种情况下你可能不应该感到可惜)。 –

7

周围使用文件名双引号和bash的文件名扩展代替ls

#!/bin/bash 
for i in ./* 
do 
    echo tar -zcvf "$i.tar.gz" "$i" 
done 
+0

+1这种方法比'read'更可靠 - 它不会通过在开始/名称的结束,等 –

0

什么反对

#!/bin/bash 
ls ./2011 | while read i; do 
do 
    printf "%s***" tar -zcvf "$i.tar.gz" "$i" 
done 

?请注意,printf可用于查看参数之间的界限。

0

的问题不在于你的脚本(虽然有可能是有问题的,太多 - 如果不出意外,这是两个量值复杂得多,它需要)。问题是当你调用脚本时,你需要用空格引用文件名。

yourscript "St. Patrick's Day Bar Night" 

对于什么是值得的,反引号中的ls是多余的;改为for i in ./2011/*。据我所知,与IFS只是不必要的,但它也可能导致问题。