更新

更新

在此输入图像描述

鉴于上述文件夹路径,我正在尝试编写一个脚本来删除超过一定天数的文件。我正在尝试使用一些更先进的技术,而不仅仅是对路径进行硬编码(我的现实生活示例有很多文件夹)。这是我到目前为止所拥有的:

#!/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 在 ...我认为这是正确的观点。

相关内容