从文件中提取时间戳并创建时间戳目录结构

时间:2017-05-25 14:55:56

标签: bash shell

我想从文本文件(日志文件)中提取时间戳,并根据日期和小时动态在文件夹中创建一个文件夹

Example file name : tag_data_2017_05_25_01_32_34.txt
file names : 
-rw-r--r-- 1 root root   0 May 25 18:56 tag_data_2017_05_25_01_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:56 tag_data_2017_05_25_02_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:56 tag_data_2017_05_25_03_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:56 tag_data_2017_05_25_04_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:57 tag_data_2017_05_25_05_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:57 tag_data_2017_05_25_06_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:57 tag_data_2017_05_25_07_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:57 tag_data_2017_05_25_08_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:57 tag_data_2017_05_25_09_32_34.txt
-rw-r--r-- 1 root root   0 May 25 18:57 tag_data_2017_05_25_10_32_34.txt

所以我想在文件夹/ 2017/05/25/01(YYYY / DD / MM / HH)中创建一个文件夹

shopt -s nullglob  
for filename in tag_data*.txt; do 
foldername=$(date +%Y%m%d%H)
    mkdir -p "$foldername"  
    mv "$filename" "$foldername"
    echo "$filename $foldername" ;
done

输出应该像: /2017/05/25/01/tag_data_2017_05_25_01_32_34.txt

但上面的脚本只是创建一个文件夹,直到20170525并移动文件夹20170525中的所有文件(不想在单个文件夹中复制)想要在层次结构中复制

文件tag_data_2017_05_25_01_32_34应该转到文件夹/2017/05/25/01/tag_data_2017_05_25_01_32_34.txt/2017/05/25/01/tag_data_2017_05_25_02_32_34.txt并继续这样做。

我是shell脚本的初学者。任何线索或帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

请勿使用date,它会为您提供当前日期,该日期可能不一定是文件名中编码的日期。

for f in tag*.txt; do
  IFS=_ read _ _ year month day hour _ <<< "$f"
  directory="$year/$month/$day/$hour"
  mkdir -p "$directory" || exit 1  # Don't continue if this fails
  mv "$f" "$directory"
done