![如何在循环内将目录更改为带有空格的文件名](https://linux22.com/image/1198153/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%BE%AA%E7%8E%AF%E5%86%85%E5%B0%86%E7%9B%AE%E5%BD%95%E6%9B%B4%E6%94%B9%E4%B8%BA%E5%B8%A6%E6%9C%89%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D.png)
我不确定该如何做,但我一直在尝试循环遍历不同的目录来创建多个文件。
例如:在当前目录中,有 3 个目录:
- 罗马帝国
- 卡萨罗马
- 埃菲尔铁塔
我的目的是光盘进入每个目录(使用循环和变量以防目录名称发生变化)在 shell 脚本中创建新文件夹,但在调用时,我在间距部分遇到了一些问题光盘。
调用代码的名称 Code,以下是我到目前为止尝试过的:
declare -a place
for d in */
do
place=("${place[@]}" "$d")
done
number=($(ls -lR | grep ^d | wc -l))
在这里,我们保存目录的名称
- 罗马帝国/
- 卡萨罗马/
- 埃菲尔铁塔/
和数字保存给定目录中的目录数,在本例中为:3。
for (( k=0 ; k < ${number} ; k++ ))
do
echo " This is place: ${place[k]} "
cd ${place[k]}
# Creating new files are not shown
cd ..
done
其结果是:
This is place: Roman Empire/
./Code.sh: line 4: cd: Roman: No such file or directory
任何关于如何做到这一点的帮助和指示都会很好
答案1
您收到的错误是因为在 bash 中(和最多其他 shell)形式扩展$var
或${var}
受单词拆分(和文件名生成,也称为通配符,尽管这不是这里的问题)的影响 - 请参阅什么时候需要双引号?
但是你可以大大简化你的代码。
不需要显式循环将目录列表放入数组中;你只需这样做
shopt -s nullglob place=( */ )
如果你喜欢循环,那么添加项目的更简单的方法是
place=() for d in */; do place+=("$d") done
无需执行诸如解析输出以
ls
获取计数之类的繁琐工作,因为您可以直接从数组中获取计数${#place[@]}
。因此ndirs=${#place[@]} for ((k=0; k<ndirs; k++)); do cd "${place[k]}" # do stuff cd - done
请注意,由于它们都是算术评估上下文,因此
ndirs
inside(( ... ))
和k
inside都不${place[k]}
需要显式地取消引用它们。$
你甚至不需要 C 风格的循环,你只需这样做
shopt -s nullglob place=( */ ) for p in "${place[@]}"; do cd "$p" # do stuff cd - done
(或者只是
for p in */; do ...
如果您不需要该数组用于任何其他目的)。