zoukankan      html  css  js  c++  java
  • Linux

    1. 概述

      1. 简述 xargs 的使用
    2. 背景

      1. 尝试批量操作文件
        1. 发现一些问题小问题
        2. 然后, 尝试解决
    3. 准备

      1. 环境
        1. OS
          1. centos7

    1. 操作: 尝试创建多个 文本文件

    1. 概述
      1. 尝试创建多个文本文件

    1. 思路1: 一个一个手动创建

    1. 这个...

      1. 这个我不说, 你们都知道...
      2. 有点费时间
    2. 示例

      # 真, 一个一个
      > touch file1
      > touch file2
      # 稍微机灵点的一个一个
      > touch file1 file2
      

    2. 思路2: 循环创建

    1. 前提

      1. 熟悉 shell 的循环语法
      2. 文件名有一定的规律
    2. 示例

      # 简单规律
      > touch file{1..2}
      # 稍微麻烦点的
      > for i in {1..2};do touch file$[i*2];done
      

    3. 思路3: 文件列表

    1. 前提

      1. 文件名可能没有那么有规律

      2. 但是有 明确的文件列表

      3. filelist

        file1
        file2
        
    2. 示例1

      > cat filelist | touch
      # 纳尼? 报错了...
      
    3. 结果: 无法运行

      1. 问题

        1. touch 为什么无法运行
      2. 解释

        1. touch 命令, 无法接受 管道输入
          1. | 是管道操作符
        2. touch 命令, 只能接受 参数
      3. 一说到参数

        1. 之前好像学过一点 xargs, 试试好使不好使
    4. 示例2

      > cat filelist |xargs touch
      
    5. 结果

      1. 没啥问题

    2. xargs

    1. 概述

      1. 一个常用命令
    2. 作用

      1. 将 管道 的输入, 转为 后续命令行 的参数
        1. 难怪经常和 | 一起出现
    3. 使用

      1. 后续命令不接受管道时, 可以尝试用 xargs 试试

    3. 场景2: 根据文件列表, 复制文件

    1. 概述

      1. 尝试给 多参数命令, 传递参数
    2. 场景

      1. 创建多个文件的时候, 发现 其实每个文件, 都有基本的 模板
      2. 我先建立一个模板
        1. temp
      3. 假如, 我可以按照文件列表, 把 模板 复制开来, 就能省很多事

    1. 思路1: 直接复制

      1. 这个大家都会

    2. 思路2: 循环复制

      1. for 循环得获取文件列表
        1. 这块我还不太熟悉, 没法讲...

    3. 思路3: xargs

    1. 尝试1: 先试试一个文件

      1. copylist

        temp file1
        
      2. 命令

        > cat copylist | xargs cp
        
      3. 结果

        1. 没有问题
    2. 尝试2: 一个文件好了, 我试试多个

      1. copylist

        temp file1
        temp file2
        
      2. 命令

        > cat copylist | xargs cp
        
      3. 结果

        1. 报错

          # 什么鬼?
          cp: target ‘file2’ is not a directory
          
    3. 疑问

      1. 执行了这么多年的 cp, 没见过这种错误啊
        1. 不过 cp 多参数的时候, 好像会出这种错
        2. 可这命令到底是 怎么执行的呢?
    4. xargs -p

      1. 概述

        1. 一个 确认机制
      2. 确认机制

        1. 打印即将执行的命令
        2. 是否执行
          1. 确认输入 y
          2. 取消输入 n
      3. 命令

        > cat copylist | xargs -p cp
        
      4. 结果

        # 原来执行的, 是这种命令...
        # 这种形式的 cp, 将 前面 n-1 项 视为需要拷贝的内容, 拷贝到某个目录下面
        # 所以, 最后一项, 必须要是一个 目录
        cp temp file1 temp file2 ?...
        
      5. 原因

        1. xargs 从 stream 里获取的内容, 最后都 成了 一行
      6. 好了, 这下要解决另一个问题

        1. 如果能把这些内容, 每次取两个取出来, 是不是就行了
          1. 是的
    5. xargs -n

      1. 概述

        1. 截断输出, 每次传递 n 个作为 命令参数
      2. 命令

        # 如果想进一步确认, 可以在 2 后面加上 -p
        > cat copylist | xargs -n 2 cp 
        
      3. 结果

        1. 这下好了
    6. 其实还可以这样

      1. 命令

        # 这样的话, 文件列表里, 就可以只有 目标文件名 了
        > cat filelist | xargs -n 1 cp temp
        
      2. 疑问

        1. 如果我的参数, 在 命令中间, 怎么办...
          1. 这个也可以解决...
    7. xargs -i

      1. 命令

        # 将 文件列表 里的内容, append 到 log 里
        # 文件名里如果有空格, 一定要用这玩意来处理
        # {} 代表每次 每次取出的内容
        > cat filelist | xargs -n 1 -i cat {} >> log
        

    ps

    1. ref

      1. xargs 命令教程

        1. 阮老师的教程, 聊胜于无吧
      2. xargs的 i 参数

    2. 后续

      1. 如果遇到 更复杂的情况
        1. 比如, 这次 2 个参数, 下次 3 个参数, 再下次 1 个参数的..
        2. 就不知道怎么搞了...
        3. 老老实实写脚本吧? 还是有别的办法?
    尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出
  • 相关阅读:
    【webpack 系列】进阶篇
    【webpack 系列】基础篇
    手写 Promise 符合 Promises/A+规范
    React-redux: React.js 和 Redux 架构的结合
    Redux 架构理解
    javascript 中的 this 判定
    编译原理
    vue 响应式原理
    强大的版本管理工具 Git
    js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)
  • 原文地址:https://www.cnblogs.com/xy14/p/12030832.html
Copyright © 2011-2022 走看看