如何使用Bash脚本或awk提取文件名

如何使用Bash脚本或awk提取文件名,bash,awk,Bash,Awk,我收到的文件的名称按以下格式构造 [2letters e.g.AF][6-digit-number sequence][Date in ccyymmdd][Time in hhmmss] 例如: AF00010720120917144500.csv 我想使用文件的日期部分自动将这些文件加载到我的数据库中 可能是这样开始的: #!/bin/bash filename_datepart=$(echo `date -d "1 day ago" +"%d%m%Y"`) filename="/home

我收到的文件的名称按以下格式构造

[2letters e.g.AF][6-digit-number sequence][Date in ccyymmdd][Time in hhmmss]
例如:

AF00010720120917144500.csv
我想使用文件的日期部分自动将这些文件加载到我的数据库中

可能是这样开始的:

#!/bin/bash
filename_datepart=$(echo `date -d "1 day ago" +"%d%m%Y"`)
filename="/home/hlosi/AF000107"$filename_datepart".csv"

但是请记住,零件
000107
会随着每个新文件而变化。

下面是一个BASH解决方案:

#!/bin/bash

#The full name
fullname="/home/hlosi/AF00010720120917144500.csv"

#Rip off the directory
file=$(basename "$fullname")

#Now pull out just the characters that we want
extract=$(echo "$file" | cut -c3-8)
echo "You want: $extract"

可以使用通配符填充未知值

#!/bin/bash
file=/home/hlosi/AF??????`date -d "1 day ago" +"%d%m%Y"`??????.csv
echo $file

我想你想要这个。以防您必须处理多个文件

#!/bin/bash
fpath=/home/hlosi/
filename_datepart=$(echo `date -d "1 day ago" +"%d%m%Y"`)
files=$(find $fpath -iname "*$filename_datepart.csv")
for file in $files
do
    echo "found file: " $file
done

请原谅我的无知,我想是时候了

find  -ctime 1  -name \*.csv -print
-mtime匹配csv的结尾和正好是1天,问题是它在24小时内工作,所以文件不到24小时,但仍然是昨天不会显示

这将是一种更简单的方法,因为它不关心将来校对时文件名格式的更改

cd pathtcsv;
d=`date -d "1 day ago" +"%d"`
d=$d find . -type f -name \*.csv -ctime 1 -exec ls -l {} \;|awk '$7 ~ d'|awk '{print $NF}'|  awk '{ print substr( $0, length($0) - 1, length($0) ) }'
#D=$D,设置为昨天的日期,它从YSterday中查找以csv结尾的文件,然后执行ls,导入awk并根据昨天的日期检查值7,其中$7是ls-l上的日期值,它最终将最后一个字段和管道打印到最后一个awk中,该awk将打印字符串并从一个字符位置拆分到另一个字符位置,这就是您想要的?您需要弄清楚您需要什么字符,这里是上面的另一个示例,用于0到10的字符位置

 d=$d find . -type f  -ctime 1 -name \*.csv -exec ls -l {} \;|awk '$7 ~ d'|awk '{print $NF}'|  awk '{ print substr( $0, 0, 10)}'

您希望每天有多少个文件?另外,您是否需要
hhmmss
中的时间?我每天收到一个文件。我尝试过与数据源进行推理,以排除时间部分,因为它每天只有一个文件,但没有任何效果。谢谢,我已将此部分调整为我的问题。我会试试看,然后再打给你。非常感谢。Bash有内置功能,因此您也不需要
cut
,但必须分阶段进行
cuttail=${file#?????};cutc8=${file%$cuttail};回显“${cutc8#??}”
。另外请注意,在插入变量时使用双引号,赋值除外。@tripleee——我在
bash
很普遍之前就学习过shell脚本编写——我倾向于坚持旧方法。你对引号的看法是对的,我应该把它们放进去。实际上,字符串替换可以追溯到很久以前;它们当然不仅仅是Bash。由于日期部分位于固定位置,
${file:8:8}
Bash
中的一步解决方案(尽管不是POSIX)。特别是因为这些人需要几天才能删除旧文件,我的脚本可能必须使用日期部分选择正确的文件。这很好:
file=/home/hlosi/AF*
date-d“1天前”+%d%m%Y“
*.csv