我正在尝试根据文件名将目录中的文件移动到另一个目录。文件名为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文件夹的根目录中。
再次,非常感谢你对此的帮助!我很感激! (并且感谢你指出你的变量正在做什么,所以我可以更好地理解它们!)
答案 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