Linux - shell - xargs - 基础

  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: 循环创建

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

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

3. 思路3: 文件列表

  1. 前提
    1. 文件名可能没有那么有规律
    2. 但是有 明确的文件列表
  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 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 2 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. 这玩意不知道怎么搞了...

猜你喜欢

转载自www.cnblogs.com/xy14/p/12030832.html
今日推荐