Linxu学习札记(一):常用命令

以前用过Linux,但是从来没有当作过主力操作系统使用,也没有试过长时在Linux下写代码,用起来称不上得心应手。现在决定把学习Linux过程中的点点滴滴记录下来,学习过程中主要翻阅《鸟哥的Linux私房菜》这本书和查看参考网上的资料。PS:鸟哥的书是极不错的,但是繁体字和台湾腔的术语读起来总是感觉怪怪的,还有有些知识点是过时的,不过影响不大。

本篇博文主要总结Linux操作系统基础操作的常用命令。

基础操作

查看当前系统的语言

1
2
user@pc:$ echo $LANG
user@pc:$ LANG="en" #在当前登录时使用英语,退出系统后恢复默认

计算器

1
user@pc:$ bc #简单的计算器

使用quit命令退出。

进入计算器后,可通过scale=number[number为小数]设置精确到的小数位数,默认为0。

查看时间

1
2
3
user@pc:$ date #显示日期
user@pc:$ cal #显示日历,默认查看当月的日历
user@pc:$ cal 3 2006 #查看2006年3月的日历

命令补全

1
user@pc:$ ca[tab][tab] #ca后紧跟两个tab,表示查找以ca开头的命令

文件补全

1
user@pc:$ ls -al file[tab][tab] #file后紧跟两个tab,表示查找以file开头的文件

用man命令查找某个命令的帮助信息时,按下“/”后,输入某个单词可搜索与其有关的内容,按“n”继续,“N”反向查找,输入“?”可进行向前查询。

whatisman -f 用于查询一个命令执行什么功能,并将查询结果打印到终端上。

aproposman -k 用于在 whatis 数据库中查找字符串。

1
2
3
4
5
6
7
user@pc:$ apropos ps #下面为输出信息
...
pptpsetup (8) - Point-to-Point Tunneling Protocol setup
printers.conf (5) - printer configuration file for cups
proc (5) - process information pseudo-filesystem
procfs (5) - process information pseudo-filesystem
...

sync 命令可把内存里的内容写入硬盘。

不知道原来文件的属性,只想要增加某个文件可写入的权限

1
user@pc:$ chmod a-w file01

设定用户具有可读、可写、可执行的权限,同组和其他人具有可执行的权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
user@pc:$ chmod u=rwx,go=rx file01 #","前后是连在一起的
```
## 查看系统的基本信息
```bash
user@pc:$ uname -r #-a查看所有信息
3.19.0-15-generic #查看实际的核心版本
user@pc:$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 15.04 #distribution版本
Release: 15.04
Codename: vivid

常用的文件操作

查看工作目录

1
user@pc:$ pwd -P #加以参数"P",可查看某个连接指向的真实地址

新建目录

1
2
user@pc:$ mkdir -p test1/test2/test3 #递归地创建目录
user@pc:$ mkdir -m 711 test #创建目录时设定权限

删除目录或文件

1
2
user@pc:$ rmdir -p test1/test2/test3 #递归地删除目录,只能删除空目录
user@pc:$ rm -f test1/test2 #递归地删除目录或文件

关于cp

1
2
3
4
5
6
7
8
9
user@pc:$ cp -a /var/log/wtmp temp #将文件的所有属性一起复制过来,否则权限可能会发生改变
user@pc:$ cp -i /var/file /usr/local #覆盖时询问,输入n或y继续
user@pc:$ cp -r /var temp #复制不为空的目录时要加上参数“r”
[hui@linux tmp]$ cp -s bashrc bashrc_slink #建立符号连接,同ln -s
[hui@linux tmp]$ cp -l bashrc bashrc_hlink #建立硬连接,同ln
hui@linux tmp]$ cp -u ~/.bashrc /tmp/bashrc #在目标文件与来源文件有差异时,才会复制,常被用于备份,使用命令mv时也有此参数
[hui@linux tmp]$ cp -d bashrc_slink bashrc_slink_2 #复制连接

删除文件

1
[hui@linux tmp]# rm ./-aaa- #删除以“-”命名开头的文件

取路径名与文件名

1
2
3
4
hui@linux ~]$ basename /etc/sysconfig/network #取得最后的文件名
network
[hui@linux ~]$ dirname /etc/sysconfig/network #取得的目录名
/etc/sysconfig

查看文件内容

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取文件内容!

    cat命令:

1
2
3
4
5
6
hui@hui-virtual-machine:~/test$ cat -n file2 #显示出行号
1 Yes, you are right!
2 file2
hui@hui-virtual-machine:~/test$ cat -A file2 #将文件的内容完整的显示出来(包含特殊字符)
Yes, you are right!$
file2^Ibefore here there's a tab $

nl命令:

-b :指定行号指定的方式,主要有两种:

  • -b a :表示不论是否为空行,也同样列出行号;
  • -b t :如果有空行,空的那一行不要列出行号;
1
2
3
4
5
6
7
hui@hui-virtual-machine:~/test$ nl -b a ./file2
1 Yes, you are right!
2 file2 before here there's a tab
3
4 Iam a good boy!
5 nothing to be here.
6

more 和less命令:

less不但可以进行向下搜索(“/”),还可以向上搜索(“?”),除了空格还可用PageUp和PageDown进行翻页。

head和tail命令:

取前几行或后几行,-n 后跟行数,默认是10行

1
2
3
4
5
6
7
8
hui@hui-virtual-machine:~/test$ tail -n 2 file2 #取后两行
Iam a good boy!
nothing to be here.
hui@hui-virtual-machine:~/test$ head -n 5 file2|tail -n 3 #取第3~5行内容
lala
Iam a good boy!
nothing to be here.

od命令:

-t :后面可以接各种『类型 (TYPE)』的输出,:

  • a :利用预设的字符来输出;
  • c :使用 ASCII 字符来输出
  • d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ;
  • f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;
  • o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;
  • x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;
1
2
3
4
5
hui@hui-virtual-machine:~/test$ od -t c /usr/bin/passwd #以ASCII码形式显示
0000000 177 E L F 002 001 001 \0 \0
0000020 002 \0 > \0 001 \0 \0 \0 300
0000040 @ \0 \0 \0 \0 \0 \0 \0 030
...

查看文件的变动时间

不加–time参数用ls命令查看的是最近文件内容发生改变时的时间。

1
2
3
4
5
hui@linux ~]$ ls -l --time=atime /etc/man.config #查看最后访问时间
-rw-r--r-- 1 hui hui 4506 Jul 19 17:53 /etc/man.config
[hui@linux ~]# ls -l --time=ctime /etc/man.config #查看最近属性或权限改变时的时间
-rw-r--r-- 1 hui hui 4506 Jun 25 08:28 /etc/man.config

修改文件的时间

通过touch命令不能修改ctime,即状态的时间。

1
2
3
4
5
6
7
hui@hui-virtual-machine:~/test$ ls -l file2
-rw-r--r-- 1 hui hui 92 8月 14 12:37 file2
hui@hui-virtual-machine:~/test$ touch -d "2 days ago" file2
hui@hui-virtual-machine:~/test$ ls -l file2 #查看mtime,时间变回两天前
-rw-r--r-- 1 hui hui 92 8月 12 13:28 file2
[hui@linux tmp]$ touch -t 0507150202 bashrc #直接输入具体日期,格式为[YYMMDDhhmm]

查看文件或目录创建时的默认属性值

新建文件或目录时,其权限为预设值减去对应的数值,文件为预设最大为666,目录为777,如预设umask为022,则新建文件的权限为666-022=644,新建的目录为755。

1
2
3
4
5
6
hui@hui-virtual-machine:~/test$ umask
0022 #第一个数值为特殊权限
hui@hui-virtual-machine:~/test$ umask -S
u=rwx,g=rwx,o=rx
[hui@linux ~]# umask 002 #设定预设值

设定文件的隐藏属性

chattr命令

  • +:增加某一个特殊参数,其它原本存在参数则不动。
  • -:移除某一个特殊参数,其它原本存在参数则不动。
  • =:设定指定值
1
2
3
4
5
6
7
8
9
10
hui@hui-virtual-machine:~/test$ sudo chattr +a file1 #文件只能将增加数据,而不能删除,只有 hui才能设定这个属性。
hui@hui-virtual-machine:~/test$ rm file1
rm: remove write-protected regular empty file ‘file1’? y
rm: cannot remove ‘file1’: Operation not permitted
hui@hui-virtual-machine:~/test$ sudo chattr +i file1 #文件不能被重命名、删除、设定连接和添加内容。
hui@hui-virtual-machine:~/test$ lsattr #显示文件的隐藏属性
----i--------e-- ./file1
-------------e-- ./test

查看文件格式

1
2
hui@hui-virtual-machine:~/test$ file jv.java #查看是ASCII、data或是二进制文件。
jv.java: C source, ASCII text

查找文件

find命令不常用,因为速度慢,whereis或locate找不到时才会用find。whereis与 locate 是利用数据库来搜寻数据,所以速度相当快。

which命令:

从环境变量设置PATH的路径中查找可执行文件。

1
2
3
4
5
[hui@linux ~]$ which passwd #默认只能显示找到的第一个可执行文件
/usr/bin/passwd
[hui@linux ~]$ which traceroute -a #加上参数-a,可列出所有能查找得到的可执行文件
/usr/sbin/traceroute
/bin/traceroute

whereis命令:

从数据库中查找,默认数据库一星期更新一次,参数:

  • -b :只找 binary 的文件
  • -m :只找在说明文件 manual 路径下的文件,即只查找说明文件
  • -s :只找source 源文件
  • -u :没有说明档的文件
1
2
hui@hui-virtual-machine:~/test$ whereis -m file
file: /usr/share/man/man1/file.1.gz

locate命令:

相当于find -name,但比后者快。locate搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。

为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

1
2
3
4
5
hui@hui-virtual-machine:~/test$ locate file1
/home/hui/test/#file1#
/home/hui/test/file1
/home/hui/test/test/file1
...

find命令:

find后加-type f,可筛选出文件,-type d可筛选出目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[hui@linux ~]$ find / -mtime 0 #将过去系统上面24小时内有变动过内容 (mtime,atime,ctime同理) 的文件列出
[hui@linux ~]$ find /etc -newer /etc/passwd #寻找/etc底下的文件,如果文件日期比 /etc/passwd 新就列出
[hui@linux ~]$ find /home -user hui #搜寻/home底下属于hui的文件
[hui@linux ~]$ find / -nouser #搜寻系统中不属于任何人的文件,可以查找出不太正常的文件
[hui@linux ~]$ find / -name passwd #找名为passwd的文件
[hui@linux ~]$ find / -size +1000k #找出系统中,大于 1MB 的档案,还可用M(MB)和G(GB)。
[hui@linux ~]$ find / -perm +7000 #搜寻文件当中含有 SGID/SUID/SBIT 的属性,7000 就是 ---s--s--t ,
# 只要含有 s 或 t 的就列出,使用 -7000 表示要含有 ---s--s--t 的所有三个权限。
[hui@linux ~]$ find / -perm +7000 -exec ls -l {} \; #将上个例子找到的文件使用 ls -l 列出来,“{}”是查找的内容,“\”表示到此为止。