Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 基于当前日期和文件名模式识别文件的脚本_Bash_Shell_Date_Csv_Curl - Fatal编程技术网

Bash 基于当前日期和文件名模式识别文件的脚本

Bash 基于当前日期和文件名模式识别文件的脚本,bash,shell,date,csv,curl,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 /docum

有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;

有人可以建议如何最好地执行此操作吗?

find
命令中,您可以将
日期
变量周围的单引号删除为

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
中使用管道来设置变量,使用和使用
-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)
而IFS=''read-r-d''文件名
做
回显“文件名:${filename}”
var=$(base64“$filename”| perl-pe's/\n//g');
var1=$(curl-XPUT)http://localhost:9200/documents-$date/document/?pipeline=附件和附件“-d'{“数据”:““$var”“}”)

done<什么不起作用?如果使用上面的命令,find命令不会拾取任何文件。但是当我使用*.csv时,它会拾取目录中我不需要的所有文件,并且只拾取特定日期的文件。你能提供一个实际的示例文件名并在其中包含正确的日期值吗?你的脚本无法工作,因为它正在查找带有curr的文件ent timestamp,您需要在find中使用正则表达式,然后才能使用我的解决方案解决问题?您可以使用我最后一次回答中的脚本示例