有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;
有人可以建议如何做到最好吗?
答案 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)