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

时间:2012-09-17 12:52:51

标签: 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/hlosi/AF000107"$filename_datepart".csv"

但请记住,000107部分随每个新文件而变化。

4 个答案:

答案 0 :(得分:1)

这是一个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"

答案 1 :(得分:1)

您可以使用通配符填写未知值

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

答案 2 :(得分:0)

我想你想要这个。如果你必须处理多个文件。

#!/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

答案 3 :(得分:0)

原谅我的无知有-atime -ctime -mtime我认为它的-ctime

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,设置为昨天的日期,它从yseterday找到csv结束它的文件然后做一个ls,管道进入awk并检查值7对昨天的日期,$ 7是日期值ls -l,它最后将最后一个字段和管道打印到最终的awk中,打印字符串并从char位置拆分到char位置,这是你想要的?你需要弄清楚你需要的字符是上面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)}'