【问题标题】:bash loop through two Directoriesbash 循环遍历两个目录
【发布时间】:2019-08-27 21:55:45
【问题描述】:

我尝试遍历两个目录并使用此脚本回显具有给定扩展名的所有文件:

#!/bin/bash
FOLDERS=/sdd/DATA/ /sdc/storage/
for d in $FOLDERS; do
echo "$d"
  FILES=$d*.txt
  for f in $FILES; do
    echo "$f"
  done
done

但我没有让这个脚本工作! 我得到 bash: sdc/storage/ 是一个目录

【问题讨论】:

  • 我希望你收到类似-bash: /sdc/storage: is a directory的错误
  • ...可以通过将/sdd/DATA/ /sdc/storage/ 括在引号中来修复。 (没有,该行设置FOLDERS=/sdd/DATA/,然后尝试执行 /sdc/storage/,这不起作用,因为--猜猜--这是一个目录。;-))更好的是请注意其中包含空格的文件名,并使用for ... in ... 或使用find ... -exec ... 执行“IFS 事情”。
  • @DevSolar, ...*could* 可以这样修复,但是将FOLDERS 定义为字符串而不是数组是非常糟糕的做法。首先针对最明显的问题,它会破坏您的目录名称带有空格的那一刻。

标签: bash quotes


【解决方案1】:

正确的做法如下所示:

#!/bin/bash
folders=( /sdd/DATA/ /sdc/storage/ )
for d in "${folders[@]}"; do
  echo "$d"
  files=( "$d"*.txt )
  printf '%s\n' "${files[@]}" # print the files array, one per line
done

注意:

  • array=( "first item" "second item" ) 定义了一个包含两项的数组; "${array[@]}" 扩展到这些项目。
  • 当扩展一个元素时,我们希望引用 shell不应该字符串拆分或 glob-expand 的部分,但不要引用任何 glob 模式;因此,"$d"*.txt
  • 我们对用户定义的变量使用小写名称。这是根据 POSIX-defined recommendation 规定的,它指定全大写名称用于对操作系统和 shell 有意义的变量,而所有其他名称保留供应用程序使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2013-09-20
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多