用于根据当前日期和文件名模式标识文件的脚本

时间:2016-12-28 10:30:12

标签: bash shell date csv curl

有10个文件位于不同的目录中,其中包含日期模式。我需要逐个选择这些文件并发送到远程站点我还想到列出文件命名模式,配置文件中的位置,然后逐个从配置文件中选择脚本,但没有任何运气。

示例文件名模式和位置​​

/documents/accounts/transfer/done/abc_yyyy-mm-dd_hh-mm-ss-[0-9]{6}.csv
/documents/namelist/transfer/done/def_yyyy-mm-dd_hh-mm-ss-[0-9]{6}.csv
/documents/newcustomer/transfer/done/ghijkl_yyyy-mm-dd_hh-mm-ss-[0-9]{6}.csv

我试过了:

#!/bin/bash
date=`date +%Y-%m-%d`;
config_file="/scripts/config/abc.cfg"; 
echo $config_file; 
URL="http://localhost:9200/document-$date";
find /documents -type f -name "*_'${date}'*.csv" | while read filename
do
       echo "filename : ${filename}"
       var=$(base64 $filename| perl -pe 's/\n//g');
       var1= curl -XPUT 'http://localhost:9200/documents-'$date'/document/?pipeline=attachment&pretty' -d' { "data" : "'$var'" }')  
done;

有人可以建议如何做到最好吗?

1 个答案:

答案 0 :(得分:1)

find命令中,您可以删除date变量周围的单引号

find  -type f -name "*_${date}*.csv"

因为双引号"会扩展bash中变量的值,所以您不必再单引号。

演示: -

touch abc_2016-12-28-3523424-acsfsc.csv
touch abc_2016-12-29-3523424-acsfsc.csv

确认一旦存在没有-name过滤器的文件

find . -maxdepth 1 -type f -print
./abc_2016-12-28-3523424-acsfsc.csv
./abc_2016-12-29-3523424-acsfsc.csv

现在将变量date设置为今天的日期为

date=$(date +%Y-%m-%d)
find  -type f -name "*_${date}*.csv"
./abc_2016-12-28-3523424-acsfsc.csv

另外,不要使用管道来设置bash中的变量,使用process-substitution并使用-print0来更健壮地处理文件名中包含特殊字符的文件。

while IFS='' read -r -d '' filename
do
    echo "filename : ${filename}"
    var=$(base64 "$filename"| perl -pe 's/\n//g');
    var1=$(curl -XPUT "http://localhost:9200/documents-$date/document/?pipeline=attachment&pretty" -d '{ "data" : "'"$var"'" }')
done < <(find -type f -name "*_${date}*.csv" -print0)