如果没有shell脚本mkdir和每天的mv文件

时间:2012-11-05 02:03:09

标签: linux bash shell

我需要检查一个有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创建它并将其移动到那里。

2 个答案:

答案 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