Bash 移动文件/创建文件夹外壳脚本

Bash 移动文件/创建文件夹外壳脚本,bash,shell,scripting,Bash,Shell,Scripting,我正在尝试根据文件名将目录中的文件移动到另一个目录。文件名将为COMPANY-ReportType\u 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%_*

我正在尝试根据文件名将目录中的文件移动到另一个目录。文件名将为
COMPANY-ReportType\u 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-”,那就太好了。然而,我只是在整个过程中遇到了一个转折

有时,他们不会提供特定的报告类型,只会有公司的BlahBlahtTimeStamp。在这种情况下,他们希望将其移动到公司文件夹的根目录中。有什么办法吗

我感谢你在这方面的帮助!我尝试了一些变化,但仍然不完全正确。希望我能多提供一些信息,这会有所帮助

我必须移动的文件:

公司报告1_yyyymmdd 公司报告2_yyyymmdd 公司文件名yyyymmdd 公司文件名yyyymmdd

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

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

命名您的变量

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
这是修复方法(它可以处理更深层的子文件夹)

新请求后的新编辑:

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

谢谢你的回复!但是,当尝试运行脚本时,我在company=line上遇到语法错误,我在
for
之后错过了
do
关键字,谢谢Raul-我确实重试了一次,但出现了一个错误:第7行:[:missing`],所以我在“$name”之后添加了一个空格,然后出现了一个错误,说明:[:*:integer expression ExpectedHanks BMW!这很好,但它会为所有内容创建文件夹。我对shell脚本还是很陌生,需要了解更多关于变量的信息…(尝试过修改脚本,但它只是走下坡路)-我刚刚编辑了我的原始帖子,试图更好地描述我正在尝试做的事情。我对这篇文章进行了修改,不需要将报告移到根目录下。这篇文章将非常有效。谢谢!!
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