【Java文件管理】关于路径里含有通配符或者正则的筛选方法

1. 参数

参数名含义默认值
type类型,支持regex(正则表达式)或者glob(通配符)regex
regexPath路径,支持正则表达式(正则表达式必须以/@开头,需要放在路径的前面,禁止出现/xxxx/x@.*这样的路径)/home/yhc/workSpace/log/2024/@0.*
globPath路径,支持通配符(通配符必须以/@开头,需要放在路径的前面,禁止出现/xxxx/x@.*这样的路径)/home/yhc/workSpace/log/2024/@*[13]
PATH_PATTERN路径截取器(必须以/@开头,需要放在路径的前面,禁止出现/xxxx/x@.*这样的路径)Pattern.compile(“^((?!/@).)*”)

2. 代码

package com.api.apidemo.tool.file;

import java.io.IOException;
import java.nio.file.*;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * @author yhc
 * @description: 文件通配符匹配器,支持正则表达式和通配符
 */
public class FileWildcardMatcher {

    /**
     * 类型,支持regex(正则表达式)或者glob(通配符)
     */
    static String type = "regex";
    /**
     * 路径,支持正则表达式(正则表达式必须以/@开头,需要放在路径的前面,禁止出现/xxxx/x@.*这样的路径)
     */
    static String regexPath = "/home/yhc/workSpace/log/2024/@0.*";
    /**
     * 路径,支持通配符(通配符必须以/@开头,需要放在路径的前面,禁止出现/xxxx/x@.*这样的路径)
     */
    static String globPath = "/home/yhc/workSpace/log/2024/@*[13]";
    /**
     * 路径截取器(必须以/@开头,需要放在路径的前面,禁止出现/xxxx/x@.*这样的路径)
     */
    static Pattern PATH_PATTERN = Pattern.compile("^((?!/@).)*");

    public static void main(String[] args) {
        fileWildcardMatcher();
    }

    /**
     * 文件通配符匹配器
     */
    private static void fileWildcardMatcher() {
        String filePath;
        if ("regex".equals(type)) {
            filePath = regexPath;
        } else {
            filePath = globPath;
        }
        String path = pathSplit(filePath);
        PathMatcher matcher = FileSystems.getDefault().getPathMatcher(type + ":" + filePath.replace("@", ""));
        Path directory = Paths.get(path);
        List<Path> files = null;
        try {
            files = Files.walk(directory)
                    .filter(matcher::matches)
                    .collect(Collectors.toList());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        for (Path file : files) {
            System.out.println(file.toAbsolutePath());
        }
    }

    /**
     * 解析路径,获取日期
     *
     * @param path 路径
     * @return 截取后/@的路径,没有找到有效的日期则返回原路径
     */
    public static String pathSplit(String path) {
        Matcher matcher = PATH_PATTERN.matcher(path);
        while (matcher.find()) {
            path = matcher.group();
        }
        // 没有找到有效的日期
        return path;
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在tar命令中,可以使用正则表达式筛选要压缩的文件,以便只压缩与正则表达式匹配的文件。具体来说,可以使用 `--exclude` 和 `--include` 选项来实现。 `--exclude` 选项用于指定一个正则表达式,表示要排除的文件或目录,不进行压缩。例如,要排除以 .log 结尾的所有文件,可以使用以下命令: ``` tar -czvf archive.tar.gz --exclude='*.log' /path/to/directory ``` 在这个命令中,`--exclude='*.log'` 表示要排除所有以 .log 结尾的文件。 `--include` 选项与 `--exclude` 选项类似,但是它用于指定要包含的文件或目录,而不是要排除的。例如,要只压缩以 .txt 结尾的所有文件,可以使用以下命令: ``` tar -czvf archive.tar.gz --include='*.txt' /path/to/directory ``` 在这个命令中,`--include='*.txt'` 表示只包含所有以 .txt 结尾的文件。 需要注意的是,在使用 `--exclude` 和 `--include` 选项时,需要将它们放在所有选项的最后面,并且要确保正则表达式被引号引起来,以防止它们被 shell 解释。 ### 回答2: 在tar压缩命令中,可以通过使用正则表达式来筛选文件,以便只选择特定的文件进行压缩。正则表达式是一种用来描述匹配字符串模式的工具,在tar命令中,正则表达式可以用来过滤文件名。 例如,假设我们要压缩一个目录下的所有以“.txt”结尾的文件,可以使用如下命令: tar -czvf archive.tar.gz --exclude='*.*' --include='*.txt' directory/ 在上述命令中,--exclude参数用于排除所有文件,--include参数用来筛选出以“.txt”结尾的文件。注意,在使用正则表达式时,我们使用了通配符“*”来表示零个或多个字符。同时,我们采用了gz压缩格式,并使用-v参数来显示压缩过程中的详细信息。 另外,如果需要同时压缩多种类型的文件,可以在--include参数中使用多个正则表达式,用空格分隔。 此外,还可以使用其他正则表达式的元字符,如“?”表示匹配一个字符、“+”表示匹配一个或多个字符、“{n}”表示匹配n个字符等,来更精确地筛选文件。 总而言之,通过在tar压缩命令中使用正则表达式,我们可以方便地筛选和压缩特定类型的文件,提高文件操作的效率。 ### 回答3: 在tar压缩命令中,我们可以使用正则表达式来筛选需要压缩的文件。 在tar命令中,使用`--exclude`参数可以指定要排除的文件或目录。可以结合正则表达式的语法来指定需要排除的文件。 假设我们有一个目录,其中包含多个文件,我们想要将其中以".txt"结尾的文件进行压缩,而忽略其他文件。 可以使用以下命令: ``` tar -czvf archive.tar.gz --exclude='!(*.txt)' directory/ ``` 其中,`archive.tar.gz`是压缩文件的名称,`directory/`是要压缩的目录。 `--exclude='!(*.txt)'`的含义是排除所有不以".txt"结尾的文件和目录。 通过使用正则表达式`!(*.txt)`,我们可以筛选出".txt"结尾的文件,其他文件将被忽略。 这样,只有以".txt"结尾的文件会被包含在压缩文件中,其他文件都会被排除。 使用tar命令配合正则表达式,我们可以灵活地筛选指定类型的文件进行压缩,提高了操作的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值