使用 inotifywait 更改文件名并进一步循环 sql 加载程序

Use inotifywait to change filename and further loop through sql loader

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

我有部分代码在工作,但有些部分正在产生问题,尤其是与 inotifywait 相关的问题。请帮忙。

在第一个循环中,我试图监控 /uploads 文件夹,当它找到 .csv 文件时,它会检查文件名是否有 space。如果是,它希望将文件名中的 space 更改为下划线。我一直在尝试找到一种在文件名中找到 "space, () or ," 的方法,但只能更改 'space' 部分。这给我一个错误,文件无法移动,没有这样的文件或目录。

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

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

文件名:abc_123.csv(代码不应进行任何更改),pqr(12 Apr).csv(代码应将其更改为 pqr_12_Apr.csv),May 12.csv(代码应将其更改为 May_12.csv) 等。 一旦这 3 个文件有了正确的命名,就可以通过 sql 加载器上传,一旦文件被处理,它们就会被删除。
我的代码是:

#!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

谢谢!

我已经将你的脚本修改成这个,

#!/usr/bin/env bash

while IFS= read -r file; do
  filename=${file#* CREATE }
  pathname=${file%/*}
  if [[ $pathname/$filename = *\ *.csv ]]; then
    echo mv -v "$pathname/$filename" "$pathname/${filename// /_}"
  fi
done < <(inotifywait -mqe create /../../upload)
  • 如果您认为输出正确,请删除 echo
  • 我只是不知道如何将脚本的其他部分与之集成,可能是创建一个单独的脚本或删除 -m(您很可能不想这样做)。如果 mkfifo 可用,您可以使用命名管道。

编辑:根据 OP 的消息,为另一个字符串删除添加另一个参数扩展。

if [[ ... ]]; then

下方添加代码
newfilename=${filename//\(\)}

然后把"${filename// /_}"改成"${newfilename// /_}"