【发布时间】:2014-09-14 21:44:05
【问题描述】:
我正在尝试编写一个bash脚本来列出当前目录的每个文件/子目录的大小,如下:
for f in $(ls -A)
do
du -sh $f
done
我使用了ls -A,因为我需要包含以点开头的隐藏文件/目录,例如.ssh。但是,如果$f 中的文件名包含空格,则上述脚本无法处理空格。
例如我有一个名为:
books to borrow.doc
上面的脚本会返回:
du: cannot access `books': No such file or directory
du: cannot access `to': No such file or directory
du: cannot access `borrow.doc': No such file or directory
有一个类似的问题Shell script issue with filenames containing spaces,但要处理的名称列表来自扩展*(而不是ls -A)。该问题的答案是将双引号添加到$f。我尝试了相同的方法,即更改
du -sh $f
到
du -sh "$f"
但结果是一样的。我的问题是如何编写脚本来处理这里的空格?
谢谢。
【问题讨论】:
-
你可以改用
find ... -execdir ...。 -
问题是空格是内部字段分隔符(IFS)。使用
find -print0 …或临时覆盖IFS变量。 -
类似
shopt -s nullglob dotglob; for f in *; do du -sh "$f"; done? -
@lxg,修改 IFS 并不能防止通配,因此仅保证不带引号的扩展安全是不够的(如果设置了
nullglob,它可能会在人们无法预料的情况下产生影响)。
标签: bash shell whitespace