我是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
我尝试与空间分开,对吗? 我该怎么办?
答案 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,请很快。
希望这会有所帮助。