我有一个文件夹,其中包含许多按日期命名的文件,如下所示:
(有些数字)-date-(somenumbers)。filet ype
其中'日期'列出如下:
20150730225001 2015年7月30日为0 10:50(和1秒)
有没有一种快速的方法来组织这个与Ubuntu终端给出这样的结构:
当前文件夹/年/月/日/小时/(所有符合条件的文件放在此处)
我一直在尝试寻找解决方案,但大多数人都对我感到困惑,因为我对Unix脚本很陌生。
答案 0 :(得分:2)
因此foo/
42-20150730225001-473826.filet
98-20141115180001-482157.filet
您可以使用此Perl脚本:
#!/usr/bin/perl
for(@ARGV) {
if (/.*-(\d{4})(\d\d)(\d\d)(\d+)-.*[.]filet/) {
`mkdir -p $1/$2/$3/ && mv $_ $1/$2/$3/$4.filet`;
}
}
或者这个oneliner:
ls | xargs perl -e 'for(@ARGV){qx{mkdir -p $1/$2/$3/ && mv $_ $1/$2/$3/$4.filet} if /.*-(\d{4})(\d\d)(\d\d)(\d+)-.*[.]filet/}'
答案 1 :(得分:1)
解决方案假设您在Ubuntu上使用bash作为shell,并且您拥有要在当前工作目录中组织的所有文件。虽然不是单行,但您可以使用字符串索引将日期的各个组成部分分隔为month
,day
,{{{ 1}}和hour
相对容易。然后使用mkdir -p
检查/创建所需的相对路径,并使用mv
将文件移动到新目标。可以添加一些复合命令以提供一些健全性检查,以确保您拥有14-digit
日期/时间字符串等。
有很多方法可以实现分离(例如date -d
等),但简单的字符串索引可能是最有效的。如果您有疑问,请告诉我们:
带有延续的半单行
for i in *; do dt=${i%-*}; dt=${dt#*-}; [ ${#dt} -eq 14 ] || continue; \
y=${dt:0:4}; mo=${dt:4:2}; d=${dt:6:2}; h=${dt:8:2}; \
mkdir -p "$y/$mo/$d/$h" && mv "$i" "$y/$mo/$d/$h" || \
printf "error: unable to create: '%s'\n" "$y/$mo/$d/$h"; done
<强>格式化强>
#!/bin/bash
for i in *; do
dt=${i%-*} ## separate date string from filename
dt=${dt#*-}
[ ${#dt} -eq 14 ] || continue ## validate 14 chars
y=${dt:0:4} ## separate into year, mo, day, hour
mo=${dt:4:2} # (you can add checks for ranges)
d=${dt:6:2}
h=${dt:8:2}
## create new dir & move or throw error
mkdir -p "$y/$mo/$d/$h" && mv "$i" "$y/$mo/$d/$h" || \
printf "error: unable to create: '%s'\n" "$y/$mo/$d/$h"
done