繁体   English   中英

如果没有,请执行Shell脚本mkdir和mv文件

[英]Shell Script mkdir if not and mv files to each day

我需要检查具有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月今天为止的每一天,每天中所有有文件的目录都有其自己的目录,然后将其创建并移动到该目录。

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM