通配符

  • ?字符代表单个字符,?不能匹配空字符。
  • *代表任意数量的字符,可以匹配空字符。
  • [...]匹配方括号之中的任意一个字符,比如[aeiou]可以匹配五个元音字母。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 假设当前目录下存在,文件 a.txt、b.txt、c.txt、ab.txt、report1.txt、report2.txt 和 report3.txt$ ls ?.txt  
a.txt b.txt c.txt  
  
$ ls ??.txt  
ab.txt  
  
$ ls [ab].txt  
a.txt b.txt  
  
$ ls *[ab].txt  
ab.txt a.txt b.txt  
  • [start-end]表示一个连续的范围。
1
2
3
4
5
6
7
8
9
$ ls [a-c].txta.txt b.txt c.txt  
$ ls report[0-9].txtreport1.txt report2.txt report3.txt```  
  
- `[^...]``[!...]`表示匹配不在方括号里面的字符(不包括空字符)。这两种写法是等价的。这种模式下也可以使用连续范围的写法`[!start-end]`  
  
```bash  
$ ls [^a].txtb.txt c.txt  
$ ls report[!2-3].txt  
report1.txt  
  • {...} 表示匹配大括号里面的所有模式,模式之间使用逗号分隔。它可以用于多字符的模式。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ echo d{a,e,i,u,o}gdag deg dig dug dog  
$ echo {cat,dog}cat dog```  
  
- `{...}``[...]`有一个很重要的区别。如果匹配的文件不存在,`[...]`会失去模式的功能,变成一个单纯的字符串,而`{...}`依然可以展开。  
  
```bash  
# 不存在 a.txt 和 b.txt$ ls [ab].txt  
ls: [ab].txt: No such file or directory  
  
$ ls {a,b}.txt  
ls: a.txt: No such file or directory  
ls: b.txt: No such file or directory  
  • 大括号可以嵌套。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ echo {j{p,pe}g,png}jpg jpeg png```  
  
- 大括号也可以与其他模式联用。  
  
```bash  
$ echo {cat,d*}cat dawg dg dig dog doug dug```  
  
- `{start..end}`会匹配连续范围的字符。如果遇到无法解释的扩展,模式会原样输出。  
  
```bash  
$ echo d{a..d}gdag dbg dcg ddg  
$ echo {11..15}11 12 13 14 15  
$ echo {a1..3c}{a1..3c}  

编译链接

ld

ld命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行程序或库文件。

ldd

ldconfig

查找搜索

find

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# find [path] -name []  
$ find / -name hello[a-z].log  
  
# 根据文件时间戳搜索  
$ find / -type f -atime -7 # 搜索近七天内被访问过的所有文件  
  
# 根据文件大小搜索  
$ find . -type f -size +10k  
  
# 删除匹配文件  
$ find . type f -name "*.txt" -delete  
  
# 搜索但跳过指定目录  
$ find . -path "./sk" -prune -o -name "*.txt" # -o means logical OR  

grep

1
2
3
grep -C 5 foo file # 显示file文件里匹配foo字串那行以及上下5行  
grep -B 5 foo file # 显示foo及前5行  
grep -A 5 foo file # 显示foo及后5行  

ack

ag

1
  

磁盘和文件系统

fdisk

 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
36
37
38
39
40
41
42
43
# 列出块设备信息:以树形展示你的磁盘以及磁盘分区信息  
$ lsblk  
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT  
sda      8:0    0 931.5G  0 disk  
└─sda1   8:1    0 931.5G  0 part /data  
sdb      8:16   0 119.2G  0 disk  
├─sdb1   8:17   0   512M  0 part /boot/efi  
└─sdb2   8:18   0 118.8G  0 part /  
  
# 检查文件系统的磁盘空间占用情况  
$ df -Tlh  
Filesystem     Type      Size  Used Avail Use% Mounted on  
tmpfs          tmpfs     1.6G  1.9M  1.6G   1% /run  
/dev/sdb2      ext4      117G  110G  613M 100% /  
/dev/sdb1      vfat      511M  6.1M  505M   2% /boot/efi  
/dev/sda1      ext4      916G  611G  260G  71% /data  
  
# fdisk磁盘分区,分区有大小限制为2T  
$ fdisk -l # 查看系统上的硬盘  
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors  
Units: sectors of 1 * 512 = 512 bytes  
Sector size (logical/physical): 512 bytes / 4096 bytes  
I/O size (minimum/optimal): 4096 bytes / 4096 bytes  
Disklabel type: gpt  
Disk identifier: 67A1E9ED-BCBF-44B4-93FD-8FA305437B2E  
  
Device     Start        End    Sectors   Size Type  
/dev/sda1   2048 1953525134 1953523087 931.5G Linux filesystem  
  
  
Disk /dev/sdb: 119.2 GiB, 128035676160 bytes, 250069680 sectors  
Units: sectors of 1 * 512 = 512 bytes  
Sector size (logical/physical): 512 bytes / 512 bytes  
I/O size (minimum/optimal): 512 bytes / 512 bytes  
Disklabel type: gpt  
Disk identifier: 0AA99923-E2A0-4D46-9A95-71036FC86EEF  
  
Device       Start       End   Sectors   Size Type  
/dev/sdb1     2048   1050623   1048576   512M EFI System  
/dev/sdb2  1050624 250068991 249018368 118.8G Linux filesystem  
  
# parted磁盘分区,相对fdisk可以对更大的磁盘进行划分  
  

mount

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# mkfs [options] [-t <vfs-type>] <device>  
mkfs -t ext4 /dev/sdc1  
  
# mount  
# mount [options] [device] [mount-point]  
# -t vfstype 指定文件系统的类型  
# -o options 主要用来描述设备或档案的挂接方式  
#     loop:用来把一个文件当成硬盘分区挂接上系统  
#        ro:采用只读方式挂接设备  
#        rw:采用读写方式挂接设备  
#        iocharset:指定访问文件系统所用字符集  
mount -t ext4 /dev/sdc1 /mnt/lfs  
  
# umount  
umount /mnt/lfs  

dd

 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 将本地的/dev/hdb整盘备份到/dev/hdd  
$ dd if=/dev/hdb of=/dev/hdd  
# 将/dev/hdb全盘数据备份到指定路径的image文件  
$ dd if=/dev/hdb of=/root/image  
# 将备份文件恢复到指定盘  
$ dd if=/root/image of=/dev/hdb  
# 备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径  
$ dd if=/dev/hdb | gzip > /root/image.gz  
# 压缩的备份文件恢复到指定盘  
$ gzip -dc /root/image.gz | dd of=/dev/hdb  
  
# 备份与恢复MBR  
## 备份磁盘开始的512个字节大小的MBR信息到指定文件:  
$ dd if=/dev/hda of=/root/image count=1 bs=512 # count=1指仅拷贝一个块;bs=512指块大小为512个字节  
## 恢复:  
$ dd if=/root/image of=/dev/had # 将备份的MBR信息写到磁盘开始部分  
  
# 拷贝内存内容到硬盘  
$ dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)  
# 拷贝光盘内容到指定文件夹,并保存为cd.iso文件  
$ dd if=/dev/cdrom(hdc) of=/root/cd.iso  
  
# 增加swap分区文件大小  
## 第一步:创建一个大小为256M的文件:  
$ dd if=/dev/zero of=/swapfile bs=1024 count=262144  
## 第二步:把这个文件变成swap文件:  
$ mkswap /swapfile  
## 第三步:启用这个swap文件:  
$ swapon /swapfile  
## 第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:  
$ swapfile    swap    swap    default   0 0  
  
# 销毁磁盘数据  
$ dd if=/dev/urandom of=/dev/hda1  
# 注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。  
  
# 测试硬盘的读写速度  
$dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file  
$ dd if=/root/1Gb.file bs=64k | dd of=/dev/null  
# 通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。  
  
# 确定硬盘的最佳块大小:  
$ dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file  
$ dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file  
$ dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file  
$ dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file  
# 通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。  
  
# 修复硬盘:  
$ dd if=/dev/sda of=/dev/sda  
# 当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。并且这个过程是安全、高效的。  
  
# 利用netcat远程备份  
$ dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234  
# 在源主机上执行此命令备份/dev/hda  
$ netcat -l -p 1234 | dd of=/dev/hdc bs=16065b  
# 在目的主机上执行此命令来接收数据并写入/dev/hdc  
$ netcat -l -p 1234 | bzip2 > partition.img  
$ netcat -l -p 1234 | gzip > partition.img  
# 以上两条指令是目的主机指令的变化分别采用bzip2、gzip对数据进行压缩,并将备份文件保存在当前目录。  
  
# 将一个很大的视频文件中的第i个字节的值改成0x41(也就是大写字母A的ASCII值)  
$ echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc  

设备管理

1
2
3
4
# mknod 创建块设备或者字符设备文件  
# mknod [OPTION]... NAME TYPE [MAJOR MINOR]  
$ mknod /dev/sdb4 b 1 1 # 创建一个块设备  
$ mknod /dev/console5 c 5 1 # 创建一个字符设备  

用户管理

1
2
3
4
5
# 增加用户  
$ adduser houmin  
  
# 把用户加到组  
$ usermod -aG sudo houmin  

软链接和硬链接

  • 硬链接:通过索引 inode来映射到文件数据。linux允许多个文件名指向同一 inode。删除硬链接并不会导致数据实体被删除,只有最后一个链接被删除,同时磁盘有新数据要存放时,才能导致数据实体删除。
  • 软链接:也称符号链接,类似于windows系统中的快捷方式,与硬链接不同,软链接就是一个普通文件,只是数据块内容有点特殊,文件用户数据块中存放的内容是另一文件的路径名的指向,通过这个方式可以快速定位到软连接所指向的源文件实体。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建硬链接  
ln [target] [link_name]  
  
# 创建软链接  
ln -s [target] [link_name]  
  
# 修改软链接  
ln -snf [new_target] [link_name]  
  
# 删除软链接  
rm -rf [link_name]  

远程同步文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# scp: secure copy,用于远程的文件的复制  
# -r 递归复制整个目录  
scp [option] [source] [dest]  
  
# rsync: remote sync, 用于数据镜像备份,可用于增量更新  
# -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD  
# -v, --verbose 详细模式输出  
# -z, --compress 对备份的文件在传输时进行压缩处理  
# -u 加上该选项后,如果DEST中的文件比SRC新,则不同步  
# -P, --partial --progress 保留那些因故没有完全传输的文件,以是加快随后的再次传输  
# --delete 删除DEST中SRC没有的文件  
# --exclude 过滤指定文件,如--exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步  
  
# rsync [option] [source] [dest]  
$ rsync -avP houmin@host1:~/data alice@host2:/data/  

包管理工具

apt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# apt 命令就是 apt-get、apt-cache 和 apt-config 中最常用命令选项的集合  
$ sudo apt update     # 更新包索引文  
$ sudo apt install nginx    # 安装包  
$ sudo apt install vim=2:8.0.1453-1ubuntu1  # 安装指定版本的包  
$ sudo apt install name.deb    # 安装本地的 deb 包文件  
  
# 安装系统中有更新的包  
$ sudo apt update  
$ sudo apt upgrade  
  
# 删除包  
# 其中 remove 命令会保留配置文件,而 purge 命令会把配置文件一起删除  
$ sudo apt remove nmap  
$ sudo apt purge nmap  
  
# 查看包的信息  
$ apt show vim  
  
# 输出指定条件的包列表  
$ apt list vim*  
  
# 搜索包  
$ apt search docker  

压缩解压

tar

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 解压  
$ tar -xf file.tar        # 解压 tar包  
$ tar -xzf file.tar.gz    # 解压tar.gz  
$ tar -xjf file.tar.bz2   # 解压 tar.bz2$ tar -xJf file.tar.xz    # 解压 tar.xz$ tar -xZf file.tar.Z     # 解压tar.Z  
$ unrar e file.rar        # 解压rar  
$ unzip file.zip          # 解压zip  
  
# 压缩  
$ tar -cvf jpg.tar *.jpg  
$ tar -czf jpg.tar.gz *.jpg  
$ tar -cjf jpg.tar.bz2 *.jpg  
$ tar -cZf jpg.tar.Z *.jpg  
$ rar a jpg.rar *.jpg  
$ zip jpg.zip *.jpg  

cpio

cpio是一个非常古老的归档工具,已逐渐被tar替代,但是有些功能是tar不存在的,所以还是分享下它的用法。

cpio用于创建、解压归档文件,也可以对归档文件执行拷入拷出的动作,即向归档文件中追加文件,或从归档文件中提取文件。它也支持tar格式的归档文件,但是对压缩后的tar(如.tar.gz格式)就没法支持了,cpio毕竟不会调用对应的(解)压缩工具。

cpio一般从标准输入获取数据,写入到标准输出,所以一般会结合管道、输入重定向、输出重定向使用。命令格式如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ cpio –o [abcv]$ cpio –i [bcdmrtuv] [patterns]$ cpio –p [adlmuv] [directory]```  
  
对应上述三种命令,cpio有三种运行模式:  
  
- **Copy-out模式**  
  
  此模式下,cpio将向归档文件中拷入文件,即进行归档操作,所以称为**归档模式**。它会从标准输入中读取待归档的文件,将它们归档到目标目标中,若未指定归档的目标,将归档到标准输出中。  
  
- **Copy-in模式**  
  
  此模式下,cpio将从归档文件中提取文件,或者列出归档文件中的文件列表。它将从标准输入中读取归档文件。  
  
- **Copy-pass模式**  
  
  此模式下,从一个目录向另一个目录或从一个文件系统向另一个文件系统复制文件,合并copy-out和copy-in命令的功能。  
  
上面命令的选项如下:  
  

-o 将文件拷贝打包成文件或者将文件输出到设备上。
-i 将打包文件解压或者将设备上的备份还原到系统。
-t 查看cpio打包的文件内容或者输出到设备上的文件内容。
-v 显示打包过程中的文件名称。
-d 在cpio还原文件的过程中,自动的建立相应的目录。
-c Use the old POSIX portable character format
-B 让默认的Blocks可以增大到5120 bytes,默认Blocks为512 bytes,这样做的好处是可以加快存取速度。
-H Produce the output archive in the specified format.

  
下面是 cpio 的常见使用案例:  
  
```bash  
# 将etc目录备份  
$ find ./etc -print | cpio -ov > etc.cpio  
# 恢复文件  
$ cpio -idv < /root/etc.cpio  
# 只是查看etc.cpio文件  
$ cpio -tv < etc.cpio  
  

定时任务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# crontab  
  
# crontab 文件含义  
# minute hour day month week command  
# 30 21 * * * /etc/init.d/smb restart # 每晚的21:30重启smb  
# * */1 * * * /etc/init.d/smb restart # 每一小时重启smb # 0,15,30,45 18-06 * * * /bin/echo `date` > dev/tty1 # 每天的18点到6点的每隔15分钟执行  
  
# 编辑 crontab 文件  
$ crontab -e  
  
# 列出 crontab 文件  
$ crontab -l  
0,15,30,45 18-06 * * * /bin/echo `date` > dev/tty1  

进阶使用

xargs

xargs命令的作用,是将标准输入转为命令行参数。大多数命令(比如rm, mkdir,ls) 与管道一起使用时,都需要 xargs 将标准输入专为命令行参数。关于 xargs与管道的区别,可以参考这篇文章

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 其命令格式如下  
$ xargs [-options] [command]  
$ find . -name "*.txt" | xargs grep "abc"  
  
# -d 参数可定制分隔符  
$ echo -e "a\tb\tc" | xargs -d "\t" echo  
a b c  
  
# -I指定每一项命令行参数的替代字符串  
$ cat foo.txt  
one  
two  
three  
  
$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'  
  
$ ls  
one two three  
  
# xargs默认只用一个进程执行命令,--max-procs 参数指定同时用多少个进程并行执行命令,0 表示不限制  
$ docker ps -q | xargs -n 1 --max-procs 0 docker kill  

parallel

chroot

chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。

1
# chroot [options] NEWROOT [COMMANDS]  
  • 增加了系统的安全性,限制了用户的权力:

在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。

  • 建立一个与原系统隔离的系统目录结构,方便用户的开发:

使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。

  • 切换系统的根目录位置,引导 Linux 系统启动以及急救系统等:

chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。

内核参数设置

Sysctl 是一个在运行时检查和改变内核参数的工具,它是在 procfs 中实现的。

1
2
3
# sysctl -a                                           # 显示所有的系统参数  
# sysctl -w kernel.domainname="example.com"       # 临时改变某个指定参数的值  
# sysctl -p /etc/sysctl.conf      # 载入sysctl配置文件  

参考资料