Linux - shell - xargs - 基础
概述
- 简述 xargs 的使用
背景
- 尝试批量操作文件
- 发现一些问题小问题
- 然后, 尝试解决
- 尝试批量操作文件
准备
- 环境
- OS
- centos7
- OS
- 环境
1. 操作: 尝试创建多个 文本文件
- 概述
- 尝试创建多个文本文件
1. 思路1: 一个一个手动创建
这个...
- 这个我不说, 你们都知道...
- 有点费时间
示例
# 真, 一个一个
> touch file1
> touch file2
# 稍微机灵点的一个一个
> touch file1 file2
2. 思路2: 循环创建
前提
- 熟悉 shell 的循环语法
- 文件名有一定的规律
示例
# 简单规律
> touch file{1..2}
# 稍微麻烦点的
> for i in {1..2};do touch file$[i*2];done
3. 思路3: 文件列表
前提
文件名可能没有那么有规律
但是有 明确的文件列表
filelist
file1
file2
示例1
> cat filelist | touch
# 纳尼? 报错了...
结果: 无法运行
问题
- touch 为什么无法运行
解释
- touch 命令, 无法接受 管道输入
- | 是管道操作符
- touch 命令, 只能接受 参数
- touch 命令, 无法接受 管道输入
一说到参数
- 之前好像学过一点 xargs, 试试好使不好使
示例2
> cat filelist |xargs touch
结果
- 没啥问题
2. xargs
概述
- 一个常用命令
作用
- 将 管道 的输入, 转为 后续命令行 的参数
- 难怪经常和 | 一起出现
- 将 管道 的输入, 转为 后续命令行 的参数
使用
- 后续命令不接受管道时, 可以尝试用 xargs 试试
3. 场景2: 根据文件列表, 复制文件
概述
- 尝试给 多参数命令, 传递参数
场景
- 创建多个文件的时候, 发现 其实每个文件, 都有基本的 模板
- 我先建立一个模板
- temp
- 假如, 我可以按照文件列表, 把 模板 复制开来, 就能省很多事
1. 思路1: 直接复制
- 略
- 这个大家都会
2. 思路2: 循环复制
- 略
- for 循环得获取文件列表
- 这块我还不太熟悉, 没法讲...
- for 循环得获取文件列表
3. 思路3: xargs
尝试1: 先试试一个文件
copylist
temp file1
命令
> cat copylist | xargs cp
结果
- 没有问题
尝试2: 一个文件好了, 我试试多个
copylist
temp file1
temp file2
命令
> cat copylist | xargs cp
结果
报错
# 什么鬼?
cp: target ‘file2’ is not a directory
疑问
- 执行了这么多年的 cp, 没见过这种错误啊
- 不过 cp 多参数的时候, 好像会出这种错
- 可这命令到底是 怎么执行的呢?
- 执行了这么多年的 cp, 没见过这种错误啊
xargs -p
概述
- 一个 确认机制
确认机制
- 打印即将执行的命令
- 是否执行
- 确认输入 y
- 取消输入 n
命令
> cat copylist | xargs -p cp
结果
# 原来执行的, 是这种命令...
# 这种形式的 cp, 将 前面 n-1 项 视为需要拷贝的内容, 拷贝到某个目录下面
# 所以, 最后一项, 必须要是一个 目录
cp temp file1 temp file2 ?...
原因
- xargs 从 stream 里获取的内容, 最后都 成了 一行
好了, 这下要解决另一个问题
- 如果能把这些内容, 每次取两个取出来, 是不是就行了
- 是的
- 如果能把这些内容, 每次取两个取出来, 是不是就行了
xargs -n
概述
- 截断输出, 每次传递 n 个作为 命令参数
命令
# 如果想进一步确认, 可以在 2 后面加上 -p
> cat copylist | xargs -n 2 cp
结果
- 这下好了
其实还可以这样
命令
# 这样就可以不用 专门的 文件列表了...
> cat filelist | xargs -n 2 cp temp
疑问
- 如果我的参数, 在 命令中间, 怎么办...
- 这个也可以解决...
- 如果我的参数, 在 命令中间, 怎么办...
xargs -i
命令
# 将 文件列表 里的内容, append 到 log 里
# 文件名里如果有空格, 一定要用这玩意来处理
# {} 代表每次 每次取出的内容
> cat filelist | xargs -n 1 -i cat {} >> log
ps
ref
-
- 阮老师的教程, 聊胜于无吧
-
后续
- 如果遇到 多种一次各个列表, 但是每次参数不一样的
- 这玩意不知道怎么搞了...
- 如果遇到 多种一次各个列表, 但是每次参数不一样的
Linux - shell - xargs - 基础的更多相关文章
- 详细介绍Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Linux shell入门基础(六)
六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...
- Linux shell入门基础(一)
Linux shell入门基础(一): 01.增加删除用户: #useradd byf userdel byf(主目录未删除) userdel -r byf 该用户的属性:usermod 用 ...
- Linux shell脚本基础学习详细介绍(完整版)二
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Linux Shell 编程基础详解——吐血整理,墙裂推荐!
第一部分:Linux Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...
- Linux Shell编程基础
在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls 显示当前路径下的文件,常用的有 -l 显示长格式 -a 显示所有包括隐 ...
- Linux - Shell - find - 基础
概述 find 基础 背景 查找文件 人的记忆能力, 是有限的 计算机里的文件数量, 虽然不是无限, 但是也不少 要去找那些 记不清楚的文件, 必然要用查找 准备 OS centos7 用户 root ...
- Linux shell脚本 基础
一.shell中三个引号的用法 1.单引号:所见即所得 例如:var=123 var2='${var}123' echo var2 var2结果为${var}123 2.双引号:输出引号中的内容,若存 ...
随机推荐
- Android 开发调试最优选项
1 开发环境 VS2019 16.4.5 2 开发调试选项 Android 选项
- 树莓派3b 换国内源 更新源
在国内要更新源的时候,因为是国外的源,总会出现网速太慢的问题, 以下是对于安装了,2017-11-29-raspbian-stretch 系统源 更换最好用root登陆操作 sudo passwd r ...
- PAT (Basic Level) Practice (中文)1038 统计同成绩学生 (20 分)
本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔.最 ...
- 深入浅出Mybatis系列六-objectFactory、plugins、mappers简介与配置
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配 ...
- C++-HDU3400-Line belt[三分]
将军饮马问题的升级版 二维平面中要从A到D,给出两条线段AB,CD,分别在线段AB,CD,以及空白处的速度为P,Q,R 求最少用时 由于最优位置满足“凸性”,且两条线段可以等价,所以可以采取三分答案迭 ...
- Treats for the Cows POJ - 3186 dp 区间dp
//dp[i][j]表示第i次从左边取,第j次从右边取的价值,所以我们可以得到状态方程 //dp[i][j]=max(dp[i-1][j]+(i+j)*a[i],dp[i][j-1]+(i+j)*a[ ...
- Windows7下Docker的安装
转自 https://blog.csdn.net/xiangxiezhuren/article/details/79698913 无法打开图3,打开属性.给其添加git路径 无法使用图2下载 h ...
- 【C语言】输出半径1到10的圆的面积,当面积值超过100时,停止执行本程序
#include<stdio.h> #define PI 3.142 int main() { int r; float area; ; r <= ; r++) { area = P ...
- 2019 LOL 全球总决赛
FPS 牛逼 涅槃重生
- vue源码的入口(四)
我们之前提到过 Vue.js 构建过程,在 web 应用下,我们来分析 Runtime + Compiler 构建出来的 Vue.js,它的入口是 src/platforms/web/entry-ru ...