我试图根据文件名中的字符创建目录结构(文件名包括文件开始写入的日期和时间)。我已经弄清楚如何读取文件名中的某些“列”并打印它们。但现在我不知道如何将它们存储为整数。这是我尝试添加到的代码:
#!/bin/bash
FILES=samplefilenames*
for file in ${FILES}; do
echo "${file}" | awk -F'[-_]' '{print $8}'
done
exit $ERRORS
我的文件名中有“-”和“_”,因此是分隔符。我可以使其成功打印我正在寻找的值。但我无法让它将这些值分配为变量。从字面上看是这样的
tempNum=echo "${file}" | awk -F'[-_]' '{print $8}'
任何帮助,将不胜感激。
编辑:
源文件名示例 -samplefilenames_2017-10-31_12-23-13.csv(文件名均以此格式包含日期/时间戳)。我想要做的目录结构是将代码添加到将它们放置在这里的现有文件中,而不是将数百个文件放在一个位置,我希望它们按日期组织在目录中。在第一级,一月、二月、三月......(第 2 列)的文件夹中,然后在每个文件夹中,该月的每一天都有子目录(第 3 列),然后在每个文件夹中,每个小时都有一个子目录那天的第 4 列)此外,我的代码中的第 8 列仅来自我的代码,因为我的文件名实际上比我的示例长。我知道该值需要相应更改。
答案1
尝试这样的事情:
#!/bin/bash
for filename in *.csv; do
dateTime=($(basename "${filename}" .csv | awk -F_ '{ print $2, $3 }'))
date="${dateTime[0]}"
time="$(echo "${dateTime[1]}" | sed -e 's/-/:/g')"
dir="$(date -d "${date} ${time}" +"%Y/%B/%d/%H")"
mkdir -p "${dir}"
mv "${filename}" "${dir}"
done
基本上,我解析日期和时间,将其转换为命令
date
可以使用的内容,用于date
生成您正在查找的目录结构的字符串表示形式,创建该目录,并将文件移动到该目录中。
目录格式为:
year/month/date/hour
如果您不希望包含年份,可以省略%Y/
命令参数中的date
。
请注意,我还没有对此进行过严格测试,YMMV。
答案2
(IFS=_-.; for f in *.csv; do set -- $f; echo $6; done)