如何在循环内将目录更改为带有空格的文件名

如何在循环内将目录更改为带有空格的文件名

我不确定该如何做,但我一直在尝试循环遍历不同的目录来创建多个文件。

例如:在当前目录中,有 3 个目录:

  1. 罗马帝国
  2. 卡萨罗马
  3. 埃菲尔铁塔

我的目的是光盘进入每个目录(使用循环和变量以防目录名称发生变化)在 shell 脚本中创建新文件夹,但在调用时,我在间距部分遇到了一些问题光盘

调用代码的名称 Code,以下是我到目前为止尝试过的:

declare -a place
for d in */
do
    place=("${place[@]}" "$d")
done

number=($(ls -lR | grep ^d | wc -l))

在这里,我们保存目录的名称

  1. 罗马帝国/
  2. 卡萨罗马/
  3. 埃菲尔铁塔/

数字保存给定目录中的目录数,在本例中为: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}受单词拆分(和文件名生成,也称为通配符,尽管这不是这里的问题)的影响 - 请参阅什么时候需要双引号?

但是你可以大大简化你的代码。

  1. 不需要显式循环将目录列表放入数组中;你只需这样做

    shopt -s nullglob
    place=( */ )
    

    如果你喜欢循环,那么添加项目的更简单的方法是

    place=()
    for d in */; do
      place+=("$d")
    done
    
  2. 无需执行诸如解析输出以ls获取计数之类的繁琐工作,因为您可以直接从数组中获取计数${#place[@]}。因此

    ndirs=${#place[@]}
    for ((k=0; k<ndirs; k++)); do
      cd "${place[k]}"
      # do stuff
      cd -
    done
    

    请注意,由于它们都是算术评估上下文,因此ndirsinside(( ... ))kinside都不${place[k]}需要显式地取消引用它们。$

  3. 你甚至不需要 C 风格的循环,你只需这样做

    shopt -s nullglob
    place=( */ )
    
    for p in "${place[@]}"; do
      cd "$p"
      # do stuff
      cd -
    done
    

    (或者只是for p in */; do ...如果您不需要该数组用于任何其他目的)。

相关内容