在Bash中无法获取包含空格的文件名数组的问题

15 浏览
0 Comments

在Bash中无法获取包含空格的文件名数组的问题

我想写一个bash脚本,需要获取目录中的文件名,我已经这样做了:

list=`ls -p -m -1 $dir | grep -v /`
list=`echo $list | tr ' ' ','`
IFS=',' read -ra list_array <<< $list

如果当前目录中不存在带有空格的文件,则变量list_array保存了正确的以空格分隔的文件名数组:

 $ echo "${list_array[*]}"
 a a.rar a.tar a.zip blah blah blah

但是,在存在文件名中带有空格的情况下,这种方法将无法正确工作。为了解决这个问题,我将其改为了以下方式:

list=`ls -p -m  $dir | grep -v /`     #这种方法对于没有空格的文件名无效
IFS=',' read -ra list_array <<< $list  

但现在list_array只保存了第一个文件的名称。

非常感谢您的帮助。

0
0 Comments

问题出现的原因是在Bash中无法获取包含空格的文件名的数组。这是因为Bash默认以空格作为分隔符,并且无法正确处理包含空格的文件名。

为了解决这个问题,可以使用换行符作为IFS(Internal Field Separator,内部字段分隔符)。通过将IFS设置为$'\n',可以告诉Bash使用换行符作为分隔符,从而正确处理包含空格的文件名。

下面是解决该问题的代码:

IFS=$'\n'
list_array=(`ls -p -m -1 . | grep -v /`)

在以上代码中,首先将IFS设置为$'\n',然后使用ls命令获取当前目录下的所有文件名,并使用管道将结果传递给grep命令。grep命令的-v选项用于排除所有以斜杠结尾的行,即排除文件夹。最后,将结果存储到名为list_array的数组中。

通过以上代码,就可以正确获取包含空格的文件名的数组了。这样就解决了在Bash中无法获取包含空格的文件名的问题。

0