0

我需要签入一个包含 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 月的每一天,从没有的一天开始的每个文件都是自己的目录,创建它并将其移动到那里。

4

2 回答 2

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

于 2012-11-05T02:21:30.537 回答
0

快速而肮脏的 Bash 解决方案

for file in log_from*.zip; do
    dirname=${file#log_from_}
    dirname=${dirname%%-*}
    [ ! -d "$dirname" ] && mkdir "$dirname"
    mv "$file" "$dirname"
done 
于 2012-11-05T05:58:23.140 回答