我需要检查一个有150.000个zip文件的目录,这种格式是这样的:
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
如果有一个名称等于文件日期的目录:
2012_08_14
然后将存在的所有文件从From_2012_08_14移动到该目录,如果没有创建它
(mkdir日期+%Y_%M_%D)
然后检查从8月到今天11月的每一天,从一天开始的每个文件都是自己的dir创建它并将其移动到那里。
答案 0 :(得分:1)
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
是可选的,但会显示正在发生的事情。我假设你的文件名都不包含空格或换行符。我还假设没有包含字母数字的文件,其中shell模式中的?
应该与数字匹配。如果您必须完全偏执,可以将每个?
扩展为[0-9]
,或者修改sed
脚本以丢弃不匹配的名称等。
答案 1 :(得分:0)
快速而肮脏的Bash解决方案
for file in log_from*.zip; do
dirname=${file#log_from_}
dirname=${dirname%%-*}
[ ! -d "$dirname" ] && mkdir "$dirname"
mv "$file" "$dirname"
done