迭代未定义数量的子目录的所有文件夹

时间:2018-03-09 15:34:59

标签: bash shell awk ksh

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

我正在使用kornshell和awk。我已经解决了这个问题:

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

所以我需要更改$FILEPATH/*.txt以便它直到最后钻进目录,然后循环遍历所有文本文件,退出目录并再次遍历文本文件,直到没有更多目录或文本文件为止不变。

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

3 个答案:

答案 0 :(得分:1)

修改您的脚本,如下所示,它适用于您(代替.将您的路径设为/tmp/my/personal/。这是您要搜索文件的位置: -

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

 done

答案 1 :(得分:1)

避免与包括空白(或其他令人不安的事情)在内的文件名挣扎 见Bash Pitfalls #1

[{'wartosc': '3.59', 'aktualizacja': '1519933403', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'bat', 'jednostka': 'V', 'minimum': 0.0, 'maksimum': 5.0}, {'wartosc': '1020', 'aktualizacja': '1519584193', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'press', 'jednostka': 'hPa', 'minimum': 0.0, 'maksimum': 1600.0}, {'wartosc': '21.2', 'aktualizacja': '1519576134', 'nazwa': 'artekroom', 'nazwa_ui': 'Pokój Artura', 'id_punktu': 1, 'jakosc_sygnalu': None, 'czujnik': 'temp', 'jednostka': '*C', 'minimum': -50.0, 'maksimum': 100.0}, {'wartosc': '23.8', 'aktualizacja': '1520020905', 'nazwa': 'testnode', 'nazwa_ui': 'Testowy', 'id_punktu': 15, 'jakosc_sygnalu': -75, 'czujnik': 'temp', 'jednostka': '*C', 'minimum': -50.0, 'maksimum': 100.0}, {'wartosc': '3.10', 'aktualizacja': '1520011249', 'nazwa': 'testnode', 'nazwa_ui': 'Testowy', 'id_punktu': 15, 'jakosc_sygnalu': -75, 'czujnik': 'bat', 'jednostka': 'V', 'minimum': 0.0, 'maksimum': 5.0}]
  • { "artekroom": { "id_punktu": 1, "nazwa_ui": "Pokój Artura", "readings": [{ "czujnik": "temp", "wartosc": "21.2", "maksimum": 100, "minimum": -50, "aktualizacja": "1519576134", "jednostka": "C" }, { "czujnik": "humi", "wartosc": "21.2", "maksimum": 100, "minimum": -50, "aktualizacja": "1520011249", "jednostka": "hPa" } ] } } 在实际目录中开始搜索
  • find . -name "*.txt" -type f -exec awk '{ ... }' {} \; 将搜索限制为模式
  • .将搜索限制为文件
  • -name为找到的每个文件执行命令
  • -type在此处插入文件名
  • -exec终止命令。转义,以便shell将其移交给{}

答案 2 :(得分:0)

在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)