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, "/");
    }
    
}
相关文章
|
28天前
|
Shell
Shell 文件包含
10月更文挑战第5天
33 4
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
22天前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
66 1
|
8天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
30 2
6种方法打造出色的Shell脚本
|
13天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
38 6
|
10天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
24天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
32 1
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
60 12
|
1月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
40 2
|
2月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别