我有一个 bash shell 脚本,它遍历某个目录的所有子目录(但不是文件)。问题是某些目录名称包含空格。
这是我的测试目录的内容:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
以及遍历目录的代码:
for f in `find test/* -type d`; do
echo $f
done
这是输出:
测试/巴尔的摩 测试/樱桃 爬坡道 测试/爱迪生 测试/新 约克 城市 测试/费城
樱桃山和纽约市被视为 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"
会产生以下输出:
樱桃 爬坡道 新的 约克 城市