我需要一种通过未定义数量的子目录编写迭代脚本的方法。
我正在使用kornshell和awk。我已经解决了这个问题:
for file in $FILEPATH/*.txt
do
awk '
{
#some awk commands
}
'
done
所以我需要更改$FILEPATH/*.txt
以便它直到最后钻进目录,然后循环遍历所有文本文件,退出目录并再次遍历文本文件,直到没有更多目录或文本文件为止不变。
对于上下文,我需要解析数据库并对某些文件运行一些命令。所以这些文件结构可能会持续一段时间。
答案 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)