如何使用 shell 脚本根据文件名表达式移动文件?

如何使用 shell 脚本根据文件名表达式移动文件?

我想使用 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,但是推荐。它允许您从另一个脚本调用此脚本并检查它是否成功。

相关内容