循环访问未定义数量的子目录的所有文件夹



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

我正在使用 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 陷阱 #1

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

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

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

这不受世界分裂的影响,即即使文件名中有空格字符,它也可以正常工作。

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

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

最新更新