用于`ls`中的名称和带空格的文件名

时间:2011-12-27 14:11:41

标签: bash special-characters filenames

由于文件名中的空格,如何解决,下一个代码无法正常工作?

IFS = '\n'
for name in `ls `
do
    number=`echo "$name" | grep -o "[0-9]\{1,2\}"`
    if [[ ! -z "$number" ]]; then
        mv "$name" "./$number"
    fi
done

3 个答案:

答案 0 :(得分:28)

不要使用命令替换:使用for name in *

答案 1 :(得分:16)

替换

for name in `ls`

使用:

ls | while read name

注意:bash变量范围很糟糕。如果你在循环中更改一个变量,它将不会在循环外生效(在我的版本中它不会,在你的版本中它将会生效)。在这个例子中,没关系。

通知2 :这适用于带空格的文件名,但对于其他一些奇怪但有效的文件名则失败。请参阅下面的Charles Duffy的评论。

答案 2 :(得分:3)

看起来像两个潜在问题

首先,IFS变量及其赋值不应包含空格。而不是

IFS = '\n'它应该是IFS=$'\n'

其次,for name in ls会导致包含spacesnewlines的文件名出现问题。如果您只想使用filename处理spaces,请执行此类操作

for name in *

我不明白这条线的重要性

number=`echo "$name" | grep -o "[0-9]\{1,2\}"`

这将为您提供filename with spaces new lines中的号码。也许这就是你想要的。