鉴于上述文件夹路径,我正在尝试编写一个脚本来删除超过一定天数的文件。我正在尝试使用一些更先进的技术,而不仅仅是对路径进行硬编码(我的现实生活示例有很多文件夹)。这是我到目前为止所拥有的:
#!/bin/bash
FILEAGE=15
#Array of folders to clean
dir_array=(
"/srv/*/folderA"
"/srv/level1D/*/folderA"
)
#function to be used for deleting files. Needs to be called with a path
function dir_delete() {
echo "Deleting:"
find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
echo ""
}
echo "##### Looping through dir_array array and using dir_delete function to delete files older than $FILEAGE days #####"
for d in "${dir_array[@]}";do
if [ -d $d ];then
echo "##### Deleting all files older than $FILEAGE in $d #####"
dir_delete $d
else
echo "##### Did not find directory: \$d #####"
echo ""
fi
done
我的脚本返回它找不到目录,如下所示:
Did not find directory: /srv/*/folderA
注意:这些文件夹中将有 15 天内无法删除的文件。
更新
使用@Kusalananda 建议'/srv/'*'/folderA'
为我解决了这个问题。如果有人想看看我做错了什么,我会在上面的原始帖子中留下错误的代码。
答案1
shell 通配模式*
不会在双引号内展开。这意味着你的循环
for d in "${dir_array[@]}";do
正在循环图案。在您致电时dir_delete
,您使用未加引号的模式,因此它们会在那里扩展(但它永远不会到达那里)。然而,该函数只会使用第一个单词与调用中的模式匹配的任何内容find
。
真正令人惊叹的是,这些模式也会在[ -d $d ]
测试中扩展,这很尴尬,因为-d
测试只需要单身的路径名。这就是脚本最终失败的原因。
相反,请确保在分配给 时正确扩展模式dir_array
:
dir_array=(
/srv/*/folderA
/srv/level1D/*/folderA
)
如果folderA
路径名的其他部分包含空格等,则路径名的该部分应加引号,但*
不应加引号。
还要记住对所有变量的扩展加双引号,除非您知道不需要引用它们的上下文。
以下行可能存在引用问题:
if [ -d $d ];then
find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
dir_delete $d
输出变量数据时还要考虑使用printf
而不是。echo
有关的:
答案2
您可以使用扩展的 glob 选项来执行此操作,该选项允许您使用 *() 扩展变量内的通配符
shopt -s extglob
dir_array=(
"/srv/*(*)/folderA"
"/srv/level1D/*(*)/folderA"
)
扩张将发生在对于 d 在 ...我认为这是正确的观点。