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

Yol*_*ola 23 bash filenames special-characters

由于文件名中的空格,下一个代码不起作用,如何修复?

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
Run Code Online (Sandbox Code Playgroud)

fge*_*fge 30

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


ugo*_*ren 17

更换

for name in `ls`

有:

ls | while read name

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

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


jay*_*ngh 5

看起来有两个潜在的问题

首先,IFS 变量及其赋值中不应有空格。代替

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

其次,for name in ls将导致文件名具有spaces和的问题newlines。如果你只是想处理filename然后spaces做这样的事情

for name in *

我不明白该行的意义

number=`echo "$name" | grep -o "[0-9]\{1,2\}"`
Run Code Online (Sandbox Code Playgroud)

这将为您提供在 中找到的filename with spaces数字new lines。也许这就是你想要的。

  • 实际上,它应该是“IFS=$'\n'”——如果没有“$”,“\n”不会被解释为换行符,而是被解释为文字反斜杠和字母“n”。 (2认同)