使用inotifywait更改文件名并进一步通过sql loader循环

问题描述 投票:0回答:1

目标:在将多个.csv文件上传到文件夹的那一刻,代码应检查每个文件名,如果合适的文件名,sqlloader应该进一步使用该文件来获取数据库中上传的数据。文件上传后,代码应删除已处理的文件。下次,重复相同的过程。

我有一部分代码在工作,但是有些正在制造问题,尤其是与inotifywait有关。请帮忙。

在第一个循环中,我试图监视/ uploads文件夹,当它找到.csv文件时,它会检查文件名是否有空间。如果是,则希望将文件名中的空格更改为下划线。我一直在尝试找到一种在文件名中找到“空格,()或”的方法,但只能更改“空格”部分。这给我一个错误,即无法移动文件,无法移动此类文件或目录。

第二个循环是分开工作的,但是当与第一个循环合并时不能工作,因为有些错误我无法调试。如果我单独运行第二个循环,则它工作正常。但是,如果有一种方法可以在一个循环中更好地优化代码,我很高兴知道。谢谢!

示例:文件夹名称:/../../ upload

文件名:abc_123.csv(代码不应做任何更改),pqr(4月12日).csv(代码应将其更改为pqr_12_Apr.csv),5月12日。csv(代码应将其更改为May_12.csv)等。一旦这3个文件具有正确的命名,就应该准备好通过sql loader进行上传,并且一旦处理了文件,它们就会被删除。我的代码是:

#!bin/bash
inotifywait -mqe create /../../upload | while read file; do
    if [[ $file = '* *'.csv]]; then
        mv "$file" ${file// /_}
    fi
done

for file in /../..upload/*.csv
do
       sqlcommand="sqlldr user/pwd control="/../xxx.ctl" data=$file silent=feedback, header"
       $sqlcommand
       rm $file
done

谢谢!

bash sql-loader inotifywait
1个回答
0
投票

我已经为此修改了您的脚本,

#!/usr/bin/env bash

while IFS= read -r file; do
  filename=${file#* CREATE }
  pathname=${file%/*}
  if [[ $file = *\ *.csv ]]; then
    echo mv -v "$pathname/$filename" "$pathname/${filename// /_}"
  fi
done < <(inotifywait -mrq -e create /../../upload)
© www.soinside.com 2019 - 2024. All rights reserved.