【问题标题】:Shell Script mkdir if not and mv files to each dayShell Script mkdir if not and mv files to each day
【发布时间】:2012-11-05 13:58:23
【问题描述】:

我需要签入一个包含 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 )

然后检查从八月到今天十一月的每一天,从没有的一天开始的每个文件都是自己的目录,创建它并将其移动到那里。

【问题讨论】:

  • 所以如果一个文件覆盖2012_08-14-23:57:12_To_2012_08_15-01:57:12,它会进入'开始'日期的文件夹,而不是'结束'日期?
  • 150,000 个文件;每两小时 1 个文件;那是很多天(12,500 天左右,或 30 多年)。您还有哪些其他文件名格式?

标签: linux bash shell


【解决方案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 脚本以丢弃不匹配的名称等。

【讨论】:

    【解决方案2】:

    快速而肮脏的 Bash 解决方案

    for file in log_from*.zip; do
        dirname=${file#log_from_}
        dirname=${dirname%%-*}
        [ ! -d "$dirname" ] && mkdir "$dirname"
        mv "$file" "$dirname"
    done 
    

    【讨论】:

    • hmmm 我收到一个错误,无法将“log_from*.zip”移动到 ittel 的子目录,
    猜你喜欢
    • 2022-12-27
    • 2018-10-27
    • 2022-12-02
    • 1970-01-01
    • 2022-12-02
    • 2022-12-02
    • 2018-09-11
    • 2022-12-28
    • 2018-05-13
    相关资源
    最近更新 更多