Linux:遇到的tips

批量copy文件

问题:有一个A文件夹中包含了我的n个文件,B文件(txt)中包含了我需要从n个文件中提取出来的m个文件的文件名,批量拷贝到C文件夹中,使用以下命令:

cat B.txt | xargs -J % cp % ~/Downloads/C

需要注意的是:B文件中包含的文件名最好是绝对路径,如果懒得加上绝对路径,就cd到A文件夹下进行操作。

批量重命名文件

问题:假设这里有200个文件,需要批量重命名,使用以下命令,mac中不可行:

for ii in {1..200}; do {rename 修改前 修改后 目的文件} done

修改前修改后的书写需要学习正则表达式,推荐教程:
http://deerchao.net/tutorials/regex/regex.htm
此外还要注意路径的问题,mac系统中rename命令不可行,还未找到原因

linux中的sed命令

关于sed的介绍,网上一抓一大把,自己度一下吧,提供几个链接:
http://blog.csdn.net/menlinshuangxi/article/details/7979504该链接中还介绍了cut和grep的基本用法。
https://www.cnblogs.com/ctaixw/p/5860221.html
自己对sed的理解:我之所以选择sed是因为他只关注文本流不关注文本是什么,不需要读取文件就可以对其进行操作,具体什么操作呢,读取特定行,删除行,替换行,插入行等等。关键是你不需要再担心你的原始文件会被破坏,也不需要提前生成bak备份,只要不加-i参数他就不会修改原始文件,会为你呈现出修改后的效果,这样就可以尝试到我的命令work以后再去修改源文件,但是在用的时候遇到了一些bug,整理一下。

sed替换整行

这里注意哈,替换整行,不是针对某一行进行操作,比如这一行压根啥也没有就一换行符,我想把它替换掉,怎么办呢,看了很多帖子,解决方案有两个

  1. 一个是使用sed的c功能(取代)和a功能(追加/新增),用法如下:
sed -e '5c\    #这里开始要替换的内容就要换行写
Those must often wipe a bloody nose. ' input.dat

实际上在我的终端里是这样的效果:
这里写图片描述
quote>后面补全代码就可以,这个是可行的,但是原谅我是一个小白,是在不知道怎么在我的循环里面加入这个元素,所以这个方法就了解一下,注意是-e,注意斜杠的方向。。。
2. 其实使用sed的替换功能s/就完全可以搞定,刚刚也说了我这一行啥都没有只有一个换行符,所以我试图去替换换行符\n,未测试成功,后来尝试了替换任意字符也就是正则表达式中的.*于是就work了,具体如下,源文件testsed中第一行什么都没有,我需要将其替换为hhh。
这里写图片描述

mac环境下-i参数报错

那我已经测试好了脚本,需要直接修改源文件,那么就可以使用sed的-i参数,但是,发生了什么呢,我这边显示的是sed: 1: "testsed": undefined label 'estsed',特别绝望,找了一下原因,mac上的sed其实与linux还是有一些不一样,在这里,需要在sed命令后面加上''运行,就不报错了:
这里写图片描述

在sed中引入变量的方法

这里先说一个小白问题,之前没写过shell脚本,但是养成了在符号前后加入空格的习惯 比如我习惯写成1 + 1 = 2而不是1+1=2,所以刚开始在shell中赋值变量时就遇到了问题,持续性的command not found,这里需要注意下,shell的赋值变量等号前后是不能有任何空格的,比如给a变量赋值1要写成a=1而不是a = 1
在以上的脚本中我将行数作为变量引入了循环以sed '1s/.*/hhh/' testsed为例说明

num=1
错误的方式:
1. sed '$nums/.*/hhh/' testsed #非常显然这样就会默认为变量是nums,但是这个变量不存在
2. sed '${num}s/.*/hhh/' testsed #报错:sed: 1: "${num}s/.*/hhh/": extra characters at the end of n command
正确的方式:
1. sed "${num}s/.*/hhh/" testsed #大括号和双引号
2. sed $num's/.*/hhh/' testsed #将sed命令和变量分离,变量不要加引号只给sed后面的命令加引号,如果变量出现在中间,怎么?
   str='hhh'
   sed $num's/.*/'$str'/' testsed #一样的思路,变量不要加引号,意思是打断了一下sed命令插个变量继续

在shell中执行命令并将结果赋值给变量

在执行的命令前后加上 ` 就好了,这个符号在mac键盘的esc键的下方。详细见脚本。
##其他技巧

awk命令

http://www.runoob.com/linux/linux-comm-awk.html

Shell脚本统计文件行数的8种方法

http://www.jb51.net/article/61943.htm

shell for循环1到100

http://blog.csdn.net/qiqiyingse/article/details/70843655

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值