使用 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// /_}"
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// /_}"