Linux 我无法使用IFS命令拆分字符串

Linux 我无法使用IFS命令拆分字符串,linux,bash,Linux,Bash,我是Bash的新手。我解决不了这个问题。我想查找并删除空文件。我无法正确获取文件名。 当我使用以下命令时,empty_文件将获得空文件名 $ empty_files=$(find ./ -name "*.txt" -size 0k) $ echo EMPTY_FILES:$empty_files; EMPTY_FILES:./e2.txt ./e1.txt ./subdir/se1.txt 之后,我想分割空的\u文件并发送到空的\u文件\u分割数组 $ IFS=' ' read -ra emp

我是Bash的新手。我解决不了这个问题。我想查找并删除空文件。我无法正确获取文件名。 当我使用以下命令时,empty_文件将获得空文件名

$ empty_files=$(find ./ -name "*.txt" -size 0k)
$ echo EMPTY_FILES:$empty_files;
EMPTY_FILES:./e2.txt ./e1.txt ./subdir/se1.txt
之后,我想分割空的\u文件并发送到空的\u文件\u分割数组

$ IFS=' ' read -ra empty_files_splitted <<< "$empty_files"
我试图用空间分开,我错了吗?
如何执行此操作?

当您读入数组(read-a…)时,bash将填充数组[0]、数组[1]、。。。。您可以使用${array[*]}或${array[@]}对元素进行迭代

要让您的示例工作:

echo${empty_files_splitted[@]}

如果您只想删除空文件,而不需要额外处理,则可以使用
find
功能执行命令。(-empty是-size 0的快捷方式)


bash
手册页的
read
部分说明:

读取-从标准输入读取一行

因此,守则

IFS=' ' read -ra empty_files_splitted <<< "$empty_files"
顺便说一下,不建议将
find
的结果作为换行符分隔的值保存在 标量变量,因为某些文件名可能包含换行符

更安全的说法是:

while IFS= read -r -d "" f; do
    empty_files_splitted+=("$f")
done < <(find ./ -name "*.txt" -size 0k -print0)
而IFS=read-r-d“f;做
空文件\u拆分+=(“$f”)

done<字符串由换行符而不是空格分隔。检查
echo EMPTY_FILES:“$EMPTY_FILES”
。谢谢,我会查看的。在bash提示符下,键入
help mapfile
——这就是将输出行读入bash数组的方式。感谢您提供的查找快捷方式,我没有使用它们,因为我将执行不同的检查。很抱歉,我查看了这个命令(echo${empty_files_splitted[@]}),仍然只有一个元素,它位于0索引中,其他元素为空。我认为,问题在于空格。有可能,$empty_文件是文件之间的新行(而不是空格)。尝试使用
echo“EMPTY\u FILES:$EMPTY\u FILES”
查找是否存在这种情况。考虑将输出“如果找到”直接输入到<>代码>读取< /代码>循环,而没有中间存储为变量。谢谢您的回答。我了解到在bash中以这种方式使用IFS会导致问题。我尝试了以下解决方案。我从sh文件访问文件名。现在没问题。查找-名称“*.txt”-大小为0k>空的_files.sh
IFS=' ' read -ra empty_files_splitted <<< "$empty_files"
readarray -t empty_files_splitted <<< "$empty_files"
while IFS= read -r -d "" f; do
    empty_files_splitted+=("$f")
done < <(find ./ -name "*.txt" -size 0k -print0)