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