遍历未定义数量的子目录的所有文件夹

Iterating through all folders of an undefined amount of subdirectories

我需要一种方法来通过未定义数量的子目录编写迭代脚本。

我正在使用 kornshell 和 awk。我已将问题简化为:

for file in $FILEPATH/*.txt
do
    awk '
        { 
            #some awk commands
        }
    '
done

所以我需要更改 $FILEPATH/*.txt 以便它深入目录直到结束,然后循环遍历所有文本文件,退出一个目录并再次遍历文本文件直到没有目录或文本文件未受影响。

对于上下文,我需要通过数据库和 运行 某些文件上的一些命令进行解析。所以这些文件结构可以持续一段时间。

像下面那样修改你的脚本它会为你工作(代替 . 把你的路径像 /tmp/my/personal/。这是你想搜索文件的地方:-

 FILEPATH=$(find . -name "*.txt")
 for file in $FILEPATH
 do
    echo $file
    awk '
    { 
        #some awk commands
    }
'

 done

为了避免与包含空白的文件名(或其他令人不安的东西)作斗争 参见 Bash Pitfalls #1

find . -name "*.txt" -type f -exec awk '{ ... }' {}  \;
  • .在实际目录中开始搜索
  • -name 将搜索限制为一个模式
  • -type 将搜索限制为文件
  • -exec 为找到的每个文件执行命令
  • {} 在此处插入文件名
  • \; 终止命令。转义了,所以 shell 确实把它交给了 find

在 Bash 中执行此操作的最简单方法是打开 globstar 选项并使用 glob 循环:

#!/bin/bash

cd "$FILEPATH" || { printf '%s\n' "Cant' change directory to '$FILEPATH'"
shopt -s globstar
for file in **/*.txt; do
  # the awk code
  awk '...' "$file"
done

这对 world splitting 是免疫的,也就是说,即使文件名中有空白字符,它也能正常工作。

如果您必须使用 find 来执行此操作,则:

while read -d '' -r file; do
  awk '...' "$file"
done < <(find "$FILEPATH" -name '*.txt' -print0)