0

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

我有一些代码工作,但有些正在产生问题,特别是与 inotifywait 相关。请帮忙。

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

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

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

文件名:abc_123.csv(代码不应进行任何更改)、pqr(12 Apr).csv(代码应将其更改为 pqr_12_Apr.csv)、May 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

谢谢!

4

1 回答 1

0

我已将您的脚本修改为此,

#!/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// /_}"

于 2020-05-12T21:55:38.350 回答