使用 find 命令查找 .sql 和 .sql.gz 文件

使用 find 命令查找 .sql 和 .sql.gz 文件

.sql.gz我有一个用于查找文件并移动它们的shell 脚本代码:

find $Dir -type f -mtime $Time -name \*sql.gz | while read file
do
    echo "Earlier $file will be moved to different folder." >> $Path_Log_File
    mv -f $file $Path_Folder
done

现在我有几个带有扩展名的文件.sql,那么我该如何修改上面的代码以使其也包含此文件扩展名。谢谢。

答案1

find 提供了一个“或”(-o)运算符:

find $Path_Backup_Dir -type f -mtime $Time \( -name \*sql.gz -o -name \*.sql \)

表达式之间的默认运算符是“and”(-a)。由于“and”的优先级高于“or”,因此我们需要使用括号将两个“-name”表达式组合在一起以获得正确的逻辑。由于 shell 通常对括号进行特殊处理,因此我使用反斜杠对它们进行了转义以保护它们。

或者,您可以使用正则表达式:

find $Path_Backup_Dir -type f -mtime $Time -regex '.*\.(sql|sql.gz)'

您还应该注意,您的 find/read 命令管道无法很好地响应具有特殊名称的文件(前导空格、尾随空格、换行符等)。例如,参见本维基寻找处理该问题的方法。

答案2

只需使用“-or”运算符:

#Find and Move backup files older than the time constraint defined
find $Path_Backup_Dir -type f -mtime $Time \( -name *sql.gz -or -name *sql \) | while read file
do
    echo "Earlier Backup $file will be moved to archive folder." >> $Path_Log_File
    mv -f $file $Path_Mysql_Archive
done

您可以使用一个命令完成所有操作:

find $Path_Backup_Dir -type f \( -name *.sql -or -name *.sql.gz \) -exec mv -f -v {} /tmp/test2 \; >> $Path_Log_File

相关内容