我有一个bash shell脚本,可以遍历某个目录的所有子目录(但不是文件)。问题是一些目录名称包含空格。如何逃避bash循环列表中的空白区域?
这里是我的测试目录的内容:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
并通过目录循环代码:
for f in `find test/* -type d`; do
echo $f
done
这里的输出:
test/Baltimore test/Cherry Hill test/Edison test/New York City test/Philadelphia
樱桃山和纽约市被视为2或3个单独的条目。
我想引用的文件名,例如:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
,但无济于事。
有一个简单的方法来做到这一点。
下面的答案很好。但是为了使这更加复杂 - 我并不总是希望使用我的测试目录中列出的目录。有时我想将目录名称作为命令行参数传入。
我把设置IFS的查尔斯的建议,并与下面的上前:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
,除非有在命令行参数(即使这些参数均以)空间这个工作得很好。例如,调用这样的脚本:test.sh "Cherry Hill" "New York City"
输出如下:
Cherry Hill New York City
不知道有关-exec是 '+' 的味道。 sweet – 2008-11-19 05:27:33
tho看起来像它也可以,就像xargs一样,只会将参数放在给定命令的末尾:/这有时会给我带来麻烦 – 2008-11-19 05:35:21
我认为-exec [name] {} +是一个GNU和4.4-BSD扩展。 (至少,它不会出现在Solaris 8上,我认为它也不在AIX 4.3中。)我想我们其他人可能会被塞进xargs ... – 2008-11-19 06:00:51