java运行shell脚本操作文件

简介: java运行shell脚本操作文件
import java.io.File;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**运行shell脚本
 * 
 *
 */
public class RunShellUtil {
    
    private static final Logger logger=LoggerFactory.getLogger(RunShellUtil.class);
    
    /**运行链接文件
     * @param sourceFile
     * @param distFile
     * @return
     * @throws Exception
     */
    public static int runLinkFile(String sourceFilePath,String distFilePath) throws Exception{
        logger.info(StringUtil.format("开始执行命令将 {} 硬连接 到{}", sourceFilePath,distFilePath));
        String[] command=getLinkFileCommand(sourceFilePath,distFilePath);
        int code = executeShellCommand(command);
        return code;
    }
    
    /**链接文件夹
     * @param sourceFilePath
     * @param disFilePath
     * @return
     * @throws Exception
     */
    public static int runLinkDirectory(String sourceFilePath,String disFilePath) throws Exception{
        logger.info(StringUtil.format("开始执行命令将文件夹 {} 硬链接到 {}", sourceFilePath,disFilePath));
        File sourceDirectory=new File(sourceFilePath);
        File disDirectory=new File(disFilePath);
        disDirectory.mkdirs();
        File[] fileList=sourceDirectory.listFiles();
        if(null == fileList || fileList.length == 0){
            return 0;
        }
        
        for(File file:fileList){
            String currentName=file.getName();
            String absolutePath=file.getAbsolutePath();
            String disAbsolutePath=joinFilePath(disFilePath,currentName);
            if(file.isDirectory()){
                runLinkDirectory(absolutePath,disAbsolutePath);
            }else{
                runLinkFile(absolutePath,disAbsolutePath);
            }
        }
        
        return 0;
    }
    
    /**获取文件链接命令
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Exception
     */
    private static String[] getLinkFileCommand(String sourceFilePath,String distFilePath) throws Exception{
        EPlatform platform=OSinfoUtil.getOsName();
        String command[]=null;
        if(platform.equals(EPlatform.Linux)){
            
            sourceFilePath=FilePathUtil.processUniqueC(sourceFilePath);
            distFilePath=FilePathUtil.processUniqueC(distFilePath);
//            
//            command="ln "+sourceFilePath+" "+distFilePath;
//            command=StringUtil.format("/bin/sh -c ln {} {}",sourceFilePath,distFilePath);
            
            command=new String[]{"/bin/sh","-c",StringUtil.format("ln {} {}", sourceFilePath,distFilePath)};
        }else {
            throw new FileOperateException("操作系统 {} 不支持文件链接",platform.toString());
        }
        return command;
    }
    
    /**移动文件
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Exception
     */
    public static int runMoveFile(String sourceFilePath,String distFilePath) throws Exception{
        logger.info(StringUtil.format("开始执行命令将 {} 移动到 {}", sourceFilePath,distFilePath));
        String command=getMoveFileCommand(sourceFilePath,distFilePath);
        int code=executeShellCommand(command);
        return code;
    }
    
    /**运行移动文件夹命令
     * @param sourceFilePath
     * @param disFilePath
     * @return
     * @throws Exception
     */
    public static int runMoveDirectory(String sourceFilePath,String disFilePath) throws Exception{
        logger.info(StringUtil.format("开始执行命令将文件夹 {} 移动到 {}", sourceFilePath,disFilePath));
        String command=getMoveDirectoryCommand(sourceFilePath,disFilePath);
        int code=executeShellCommand(command);
        return code;
    }
    
    /**获取移动文件命令
     * @param sourceFilePath
     * @param fistFilePath
     * @return
     */
    private static String getMoveFileCommand(String sourceFilePath,String distFilePath) throws Exception{
        EPlatform platform=OSinfoUtil.getOsName();
        String command=null;
        if(platform.equals(EPlatform.Windows)){
            //windows
            command="cmd /c move "+sourceFilePath+" "+distFilePath;
        }else if(platform.equals(EPlatform.Linux)){
            //linux
            command="mv "+sourceFilePath+" "+distFilePath;
        }else{
            throw new FileOperateException(StringUtil.format("该系统 {} 不支持文件移动命令", platform));
        }
        return command;
    }
    
    /**获取移动文件夹命令
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Exception
     */
    private static String getMoveDirectoryCommand(String sourceFilePath,String distFilePath) throws Exception{
        EPlatform platform=OSinfoUtil.getOsName();
        String command=null;
        if(platform.equals(EPlatform.Windows)){
            //windows
            command="cmd /c move "+sourceFilePath+" "+distFilePath;
        }else if(platform.equals(EPlatform.Linux)){
            //linux
            command="mv -fr "+sourceFilePath+" "+distFilePath;
        }else{
            throw new FileOperateException(StringUtil.format("该系统 {} 不支持文件夹移动命令", platform));
        }
        return command;
    }
    
    /**运行复制文件命令
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Exception
     */
    public static int runCopyFile(String sourceFilePath,String distFilePath) throws Exception{
        logger.info(StringUtil.format("开始执行命令将 {} 复制到 {}", sourceFilePath,distFilePath));
        String command=getCopyFileCommand(sourceFilePath,distFilePath);
        int code=executeShellCommand(command);
        return code;
    }
    
    /**运行复制文件夹命令
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Excetion
     */
    public static int runCopyDirectory(String sourceFilePath,String distFilePath) throws Exception{
        logger.info(StringUtil.format("开始执行命令将文件夹 {} 复制到 {}", sourceFilePath,distFilePath));
        String command=getCopyDirectoryCommand(sourceFilePath,distFilePath);
        int code=executeShellCommand(command);
        return code;
    }
    
    /**获取文件复制命令
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Exception
     */
    private static String getCopyFileCommand(String sourceFilePath,String distFilePath) throws Exception{
        EPlatform platform=OSinfoUtil.getOsName();
        String command=null;
        if(platform.equals(EPlatform.Windows)){
            command="cmd /c Copy "+sourceFilePath+" "+distFilePath;
        }else if(platform.equals(EPlatform.Linux)){
            command="cp "+sourceFilePath+" "+distFilePath;
        }else{
            throw new FileOperateException("操作系统 {} 不支持文件复制",platform.toString());
        }
        return command;
    }
    
    /**获取复制文件夹命令
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Exception
     */
    private static String getCopyDirectoryCommand(String sourceFilePath,String distFilePath) throws Exception{
        EPlatform platform=OSinfoUtil.getOsName();
        String command=null;
        if(platform.equals(EPlatform.Windows)){
            //windows
            command="cmd /c Copy "+sourceFilePath+" "+distFilePath;
        }else if(platform.equals(EPlatform.Linux)){
            //linux
            command="cp -r "+sourceFilePath+" "+distFilePath;
        }else{
            throw new FileOperateException("操作系统 {} 不支持文件夹复制",platform.toString());
        }
        return command;
    }
    
    /**执行shell命令
     * @param sourceFilePath
     * @param distFilePath
     * @return
     * @throws Exception
     */
    public static int executeShellCommand(String... command) throws Exception{
        Process process  = Runtime.getRuntime().exec(command);
        InputStreamReader ir = new InputStreamReader(process
                .getInputStream());
        LineNumberReader input = new LineNumberReader(ir);
        String line;
        StringBuffer b=new StringBuffer();
        while ((line = input.readLine()) != null) {  
              b.append(b);
        } 
        
        int code = process.waitFor();
        logger.info(StringUtil.format("执行命令 {} 返回code {} 返回内容 {}", NormalUtil.join(command," "),code,b.toString()));
        if(code != 0){
            throw new Exception(StringUtil.format("执行命令 {} 出错,{}", command.toString(),b.toString()));
        }
        return code;
    }

    public static  List<String> runShell(String shStr) throws Exception {
        List<String> strList = new ArrayList<String>();

        Process process;
        process = Runtime.getRuntime().exec(new String[] {"/bin/sh","-c",shStr},null,null);
        InputStreamReader ir = new InputStreamReader(process
                .getInputStream());
        LineNumberReader input = new LineNumberReader(ir);
        String line;
        process.waitFor();
        while ((line = input.readLine()) != null) {
            strList.add(line);
        }

        return strList;
    }
    
    /**文件路径连接
     * @param paths
     * @return
     */
    public static String joinFilePath(String...paths){
        if(null == paths || paths.length == 0){
            return null;
        }
        return NormalUtil.join(paths, "/");
    }
    
}
相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
84 9
|
9天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
65 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
30天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
88 34
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
46 3
|
2月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
3月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
127 1
|
2月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
74 2
6种方法打造出色的Shell脚本
|
2月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
79 1
|
2月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
76 2