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

时间:2019-10-29 08:42:50

标签: linux bash

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

$ empty_files=$(find ./ -name "*.txt" -size 0k)
$ echo EMPTY_FILES:$empty_files;
EMPTY_FILES:./e2.txt ./e1.txt ./subdir/se1.txt

之后,我想分割empty_files并发送到empty_files_splitted数组。

$ IFS=' ' read -ra empty_files_splitted <<< "$empty_files"

但是,当我运行IFS命令时,它仅传递一个文件名。 empty_files_splitted数组中只有一个值。为什么?

$ echo ${empty_files_splitted[0]}
./e2.txt

我尝试与空间分开,对吗? 我该怎么办?

2 个答案:

答案 0 :(得分:0)

当您读入一个数组(读-a ...)时,bash将填充array [0],array [1],...。您可以使用$ {array [*]}遍历元素,或$ {array [@]}。

为您的工作示例:

  

回显$ {empty_files_splitted [@]}

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

find ./ -name "*.txt" -size 0K -delete

# OR using -empty test instead of -size
find . -name '*.txt' -delete

# To print and delete
find . -name '*.txt' -delete -print

答案 1 :(得分:0)

read手册页的bash部分指出:

  

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

因此代码

IFS=' ' read -ra empty_files_splitted <<< "$empty_files"

仅读取第一行./e2.txt并为其分配empty_files_splitted,然后其余行将被丢弃。

如果要正确分配阵列,请尝试以下操作:

readarray -t empty_files_splitted <<< "$empty_files"

顺便说一句,不建议将find的结果作为换行符分隔的值保存在 标量变量,因为某些文件名可能包含换行符。

说些类似的话会更安全

while IFS= read -r -d "" f; do
    empty_files_splitted+=("$f")
done < <(find ./ -name "*.txt" -size 0k -print0)

了解这里发生的情况可能并不容易,但是您会理解的 如果您喜欢写bash,请很快。

希望这会有所帮助。