【问题标题】:Moving files/creating folders shell script移动文件/创建文件夹 shell 脚本
【发布时间】:2014-02-05 07:38:07
【问题描述】:

我正在尝试根据文件名将目录中的文件移动到另一个目录。文件名将是COMPANY-ReportType_timestamp

我目前正在使用它来制作目录:

for i in *
        do mkdir /mnt/folder/"${i%-*}"
           mkdir /mnt/folder/"${i%-*}"/"${i%_*}"
done

并使用它来移动文件:

for i in *
        do mv $i /mnt/folder/"${i%-*}"/"${i%_*}"
done

在此脚本中,它将创建“COMPANY”文件夹,然后在其中创建“COMPANY-ReportType”文件夹。如果我可以从子文件夹中解析“Company-”,那就太好了。但是,我只是对整个过程有所了解。

有时,他们不会提供特定的 ReportType,而只会有 COMPANY-blahblahtimestamp。在这种情况下,他们希望将其移动到 COMPANY 文件夹的根目录。关于如何做到这一点的任何想法??

感谢您对此的帮助!我尝试了一些变化,但仍然不太正确。希望我提供更多信息会有所帮助...:

我必须移动的文件:

公司报告1_yyyymmdd 公司-Report2_yyyymmdd 公司-文件名yyyymmdd 公司-文件名-yyyymmdd

我需要的结果是创建了一个 Company 文件夹,如果它不存在的话。然后在 Company 下创建 Report1 和 Report2 的文件夹,然后将 Report1 和 Report2 文件移到它们的文件夹中。然后将不带 _ 的两个文件移动到 Company 文件夹的根目录中。

再次感谢您在这方面的帮助!我很感激! (感谢您指出变量的作用,以便我更好地理解它们!)

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    这是修复(它可以处理更深的子文件夹)

    for i in *
    do 
      folder=${i%_*}                          # folder = COMPANY-ReportType
      folder="/mnt/folder/${folder//-//}"     # folder = /mnt/folder/COMPANY/ReportType
      mkdir -p "${folder}"     # mkdir with -p option: no error if existing, make parent directories as needed exist or not.
      mv "$i" "${folder}"      
    done
    

    新请求后的新编辑:

    for i in *               # sample as: Company-Report1_yyyymmdd Company-Report2_yyyymmdd Company-Filenameyyyymmdd Company-Filename-yyyymmdd
    do
      if [[ "$i" =~ _ ]]; then                   # check if the file name has "_" or not.
         folder=${i%_*}                          # folder = COMPANY-ReportType
         folder="/mnt/folder/${folder//-//}"     # folder = /mnt/folder/COMPANY/ReportType
      else
         folder="/mnt/folder/${i%%-*}"           # folder = /mnt/folder/COMPANY
      fi
    
      mkdir -p "${folder}"     # mkdir with -p option: no error if existing, make parent directories as needed exist or not.
      mv "$i" "${folder}"
    done
    
    mkdir -p /mnt/folder/Company/Report1
    mv Company-Report1_yyyymmdd /mnt/folder/Company/Report1
    mkdir -p /mnt/folder/Company/Report2
    mv Company-Report2_yyyymmdd /mnt/folder/Company/Report2
    mkdir -p /mnt/folder/Company
    mv Company-Filenameyyyymmdd /mnt/folder/Company
    mkdir -p /mnt/folder/Company
    mv Company-Filename-yyyymmdd /mnt/folder/Company
    

    【讨论】:

    • 感谢宝马!这很好用,但它会为所有内容创建文件夹。我还是 shell 脚本的新手,需要了解更多关于变量的信息......(尝试稍微修改你的脚本,但它只是走下坡路) - 我刚刚编辑了我的原始帖子,试图更好地描述我正在尝试的内容做。
    • 我对这个进行了修改,不需要完成移动到根目录的报告。这将完美地工作。谢谢!!
    【解决方案2】:

    为变量命名

    for i in *
    do
            company=${i%-*}
            rest=${i#*-}
            type=${rest%_*}
            name=${rest#*_}
            if [ $type -eq $name]; then # No report type
                 mkdir -p /mnt/folder/$company
                 mv $i /mnt/folder/$company/$name
            else
                 mkdir -p /mnt/folder/$company/$type
                 mv $i /mnt/folder/$company/$type/$name
            fi
    done
    

    【讨论】:

    • 感谢您的回复!但是,在尝试运行脚本时,我在 company= line 上遇到语法错误
    • 我在for之后错过了do关键字
    • 谢谢 Raul - 我确实再试了一次,但出现错误:第 7 行:[: missing `]' 所以我在 "$name" 之后添加了一个空格,然后出现错误说明:[: * : 需要整数表达式