我需要在具有150.000个zip文件的DIR中检查使用这种格式:
log_from_2012_08_14-11:57:12_To_2012_08_14-13:57:12.zip
log_from_2012_08_14-13:57:12_To_2012_08_14-15:57:12.zip
log_from_2012_08_14-15:57:12_To_2012_08_14-17:57:12.zip
如果有名称等于文件当天的dir:
2012_08_14
然后将存在的所有文件从_2012_08_14移动到该dir,如果不创建
(mkdir日期 %y_%m_%d)
,然后检查自八月至11月的八月以来的每一天,从DOENST拥有自己的DIR的每一天的文件创建它并将其移动到那里。
cd /relevant/log/directory
# Create the necessary sub-directories
ls *from_????_??_??-??:??:??_To_????_??_??-??:??:??.zip |
sed 's/.*from_([0-9]{4}_[0-9][0-9]_[0-9][0-9]).*/1/' |
sort -u |
xargs mkdir -p
# Move the files into the sub-directories
ls *from_????_??_??-??:??:??_To_????_??_??-??:??:??.zip |
sed 's/.*from_([0-9]{4}_[0-9][0-9]_[0-9][0-9]).*/mv & 1;/' |
sh -x
-x
是可选的,但是向您展示了发生的情况。我假设您的文件名称都不包含空格或新线。我还假设没有具有字母数字的文件,其中壳模式中的?
有望与数字匹配。如果您必须完全偏执,则可以将每个?
扩展到[0-9]
,或者修改sed
脚本以丢弃与不匹配的名称等。
快速而肮脏的bash解决方案
for file in log_from*.zip; do
dirname=${file#log_from_}
dirname=${dirname%%-*}
[ ! -d "$dirname" ] && mkdir "$dirname"
mv "$file" "$dirname"
done