移动文件/创建文件夹shell脚本

时间:2014-02-03 14:59:04

标签: bash shell scripting

我正在尝试根据文件名将目录中的文件移动到另一个目录。文件名为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文件夹的根目录。关于如何做到这一点的任何想法??

我很感激这方面的帮助!我尝试了一些变化,但仍然不太正确。希望如果我提供更多信息,它将有助于......:

我必须移动的文件:

公司-Report1_yyyymmdd 公司Report2_yyyymmdd 公司Filenameyyyymmdd 公司名-YYYYMMDD

我需要的结果是创建了一个公司文件夹(如果它尚不存在)。然后在公司下创建Report1和Report2的文件夹,然后将Report1和Report2文件移入其文件夹。然后将没有_的两个文件移动到Company文件夹的根目录中。

再次,非常感谢你对此的帮助!我很感激! (并且感谢你指出你的变量正在做什么,所以我可以更好地理解它们!)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

命名您的变量

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