我想使用 shell 脚本实现以下目标。当使用文件作为参数调用脚本时,它应该根据文件名称的一部分移动文件。
例如,“汽车保险报价_zz21.pdf”排序到 21.汽车保险(FilingCab 的子文件夹) “2012-09-01 家庭保险 quote_zz20.pdf”排序到 20.家庭保险(FilingCab 的子文件夹)档案室)
从逻辑上讲,我认为它应该读成这样。我很久以前就做过编程,所以我认为有算法,但没有命令或语法。
非常感谢大家的帮助!
FileToMove = $1
FolderNo = (The number after zz and before a .)
ParentFolder = (~/FilingCab)
FolderList = (List of all folders in ParentFolder)
TargetFolder = (Folder among FolderList that begins with FolderNo) - use grep?
if TargetFolder <> not empty
cd ParentFolder
mv FileToMove to TargetFolder
end with success
else
do nothing
endif
end script
答案1
尝试这样的事情:
#! /bin/bash
# Config variable(s)
ParentFolder="~/FilingCab"
# arg processing (minimalist :)
FileToMove="$1"
# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf/\1/')
# use find to search for subdirectories of parent folder that begin
# with the folder no followed by a '.'
TargetFolder=$(find "$ParentFolder" -maxdepth 1 -type -a -d -name "${FolderNo}.*")
NumFolders=$(echo "$TargetFolder" | wc -l)
if [ "$NumFolders" -eq 1 ] ; then
mv "$ParentFolder/$FileToMove" "$TargetFolder/"
else
echo "Error: $NumFolders beginning with "$FolderNo." found" >&2
exit 1
fi
请注意所有变量名称周围的双引号。这始终是安全/正确的做法,但在您的情况下,这是必不可少的,因为您作为示例给出的文件名和目录名中包含空格字符。
命令-maxdepth 1
中的find
只搜索 $ParentFolder 的直接子目录(即忽略子目录的子目录)。如果这不是您的意思,只需删除该部分即可。这find
将搜索 $ParentFolder 中以 $FolderNo 开头的任何子目录。
我不完全确定“如果 TargetFolder 不等于非空”是什么意思,我假设您的意思是“字符串 $TargetFolder 非空”。通常,我会检查 $TargetFolder 是否存在并且是一个目录,但由于我们从 a 获取目录名称find -type d
,因此它只能是空或目录。或者如果有多个以“$FolderNo”开头的,则可能更多。
我认为最好检查一下我们是否从查找中得到一个且恰好一个结果。任何其他值都是错误,我们无法移动文件。 0 表示未找到匹配的文件夹。 2 个或更多表示多个以“$FolderNo”开头的文件夹。被找到。
发送到 stderr 的警告消息是可选的。也是如此exit 1
,但是推荐。它允许您从另一个脚本调用此脚本并检查它是否成功。