工利其器:shell使用

0. 环境要求

  • shell环境:mac 或 linux 或 cygwin

1. 按目录结构拷贝部分文件

想结合着通配符(ls命令支持的那种),将指定目录下的部分文件带着目录结构筛选出来,拷贝到另一个目录下。

例如:一个多module到mvn项目,将所有子项目src/main/resources目录下的yml文件拷贝出来备份。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ ls -1 */src/main/resources/*.yml
crm-collector-xxx/src/main/resources/application.yml
crm-collector-yyy/src/main/resources/application.yml
crm-main/src/main/resources/application.yml
crm-service/src/main/resources/application-service.yml
$ ls -1 */src/main/resources/*.yml |cpio -pdmuv copy2zjy
copy2zjy/crm-collector-xxx/src/main/resources/application.yml
copy2zjy/crm-collector-yyy/src/main/resources/application.yml
copy2zjy/crm-main/src/main/resources/application.yml
copy2zjy/crm-service/src/main/resources/application-service.yml
20 blocks
$ tree copy2zjy
copy2zjy
├── crm-collector-xxx
│   └── src
│   └── main
│   └── resources
│   └── application.yml
├── crm-collector-yyy
│   └── src
│   └── main
│   └── resources
│   └── application.yml
├── crm-main
│   └── src
│   └── main
│   └── resources
│   └── application.yml
└── crm-service
└── src
└── main
└── resources
└── application-service.yml

16 directories, 4 files

相关命令

  • ls – list directory contents
  • cpio – copy files to and from archives
  • tree - list contents of directories in a tree-like format

2. 生成批量操作脚本

对于给定的参数列表,生成批量操作脚本。例如:给定一个文件或目录列表,批量删除

1
2
3
4
5
6
7
$ ls -d1 *service*/target
crm-service-api/target
crm-service/target

$ ls -d1 *service*/target | awk '{print "rm -rfv "$1}'
rm -rfv crm-service-api/target
rm -rfv crm-service/target

对于生成的批量脚本,可以拷贝粘贴执行,也可以直接执行:

1
$ ls -d1 *service*/target | awk '{print "rm -rfv "$1}' | sh

docker 批量删除镜像

1
$ docker images |grep {your-image-name} | awk '{print "docker rmi "$3}'

3. shell下的时间转换

时间转epoch seconds

1
2
3
4
5
6
$ date "+%s"
1567568345
$ date -v-3m "+%s" #3个月前
1559620329
$ date -v-3m -v-3d -v0H -v0M -v0S "+%s" #3个月3天前,时分秒设置为0
1559318400

epoch seconds 转时间

1
2
3
4
5
6
$ date -r 1567568345
Wed Sep 4 11:39:05 CST 2019
$ date -j -r 1567568345 "+%Y-%m-%d %H:%M:%S"
2019-09-04 11:39:05
$ date -j -r 1559318400 "+%Y-%m-%d %H:%M:%S"
2019-06-01 00:00:00