文章以ubuntu
下Bash
演示为例,其它linux发行版基本相同。
Roc@ubuntu:~$ command [-options] parameter1 parameter2 ...
指令 选项 参数(1) 参数(2)
说明:
『指令(command)』
或『可执行文件』
;command
为指令的名称,例如变换路径的指令为 cd 等等;中刮号[]
并不存在于实际的指令中,而加入选项设定时,通常选项前会带 -
号,例如 -h;--
符号,例如 --help;parameter1 parameter2..
为依附在选项后面的参数,或者是 command 的参数;空格
来区分,不论空几格 shell 都视为一格;[Enter]
键后,该指令就立即执行。 [Enter]键代表着一行指令的开始启动;\
来跳脱[Enter]符号,使指令连续到下一行;其他:
a. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。
data
显示时间与日期全称: date
**简述:**显示当前系统时间与日期等信息。
常用语法:date [格式化输出字符]
示例:
#例一:基础用法
roc@ubuntu:~$ date
Sun Nov 14 21:13:09 CST 2021
#例二:格式化输出
roc@ubuntu:~$ date +%Y/%m/%d
2021/11/14
roc@ubuntu:~$ date +%H:%M
21:13
cal
显示日历全称: calender
**简述:**显示日历。
常用语法:cal [month] [year]
示例:
#例一:输出当前系统时间的月份日历
roc@ubuntu:~$ cal
November 2021
Su Mo Tu We Th Fr Sa
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
#例二:输出指定2011年11月的日历
roc@ubuntu:~$ cal 11 2021
November 2021
Su Mo Tu We Th Fr Sa
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
bc
计算器全称: bash calculator
**简述:**类似于windows的计算器,可进行常规的加减乘除等计算。输入命令会进入bc
软件的工作环境,输入quit
退出。
常用语法:bc [选项] [参数]
示例:
roc@ubuntu:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+3 #加法
4
10%3 #求余
1
11*14 #乘法
154
2^3 #乘方
8
quit #退出
man
全称: manual
**简述:**获取命令的详细使用说明。输入指令会进入man
的指令环境,Enter
键下翻,q
键退出。
常用语法:man 命令名
示例:
roc@ubuntu:~$ man date
DATE(1) User Commands DATE(1)
NAME #NAME <==这个指令的完整全名,如下所示为 date 且说明简单用途为设定与显示日期/时间
date - print or set the system date and time
SYNOPSIS #这个指令的基本语法如下所示
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
DESCRIPTION #详细说明刚刚语法谈到的选项与参数的用法
Display the current time in the given FORMAT, or set the system date.
Mandatory arguments to long options are mandatory for short options too.
-d, --date=STRING #左边-d 为短选项名称,右边--date 为完整选项名称
display time described by STRING, not 'now'
#......中间省略......
--version
output version information and exit
## 底下就是格式化输出的详绅数据!
FORMAT controls the output. Interpreted sequences are:
%% a literal %
%a locale's abbreviated weekday name (e.g., Sun)
#......中间省略......
AUTHOR #指令作者
Written by David MacKenzie.
REPORTING BUGS #有问题请留言给底下的 email
GNU coreutils online help:
Report date translation bugs to
COPYRIGHT #版权信息,遵循GPL协议
Copyright © 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later
.
This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent per‐
mitted by law.
SEE ALSO #还可以从哪里查到与 date 相关的说明
Full documentation at:
or available locally via: info ' (coreutils) date invocation'
GNU coreutils 8.30 September 2019 DATE(1)
备注:
首行DATE(1)括号内1的含义:
代号 | 代表内容 |
---|---|
1 | 使用者在shell环境中可以操作的命令或可运行文件 |
2 | 系统核心可呼叫的函数与工具等 |
3 | 一些常用的函数(function)与函式库(library),大部分为C的函式库(libc) |
4 | 装置文件的说明,通常在/dev下的文件 |
5 | 配置文件或者是某些文件的格式 |
6 | 游戏(games) |
7 | 惯例与协议等,例如Linux文件系统、网络协议、ASCII code等等的说明 |
8 | 系统管理员可用的管理命令 |
9 | 跟kernel有关的文件 |
info
在所有的Unix Like
系统当中,都可以利用man
来查询指令或者是相关档案的用法;但是,在Linux里面则又额外提供了一种在线求助的方法,那就是利用info
。
info页面比man page编写得要更好、更容易理解,也更友好,但man page使用起来确实要更容易得多。一个man page只有一页,而info页面几乎总是将它们的内容组织成多个区段(称为节点),每个区段也可能包含子区段(称为子节点)。
可以将 info page 想成是文本模式的网页显示数据。 不过你要查询的目标数据的说明文件必须要以 info 的格式来写成才能够使用 info 的特殊功能(例如超链接)。 而这个支持 info 指令的文件默认是放置在/usr/share/info/
这个目录当中的。 举例来说,info 这 个指令的说明文件有写成 info 格式,所以,使用info info
可以得到如下的画面:
#常用语法:info 命令名
roc@ubuntu:~$ info info
Next: Stand-alone Info, Up: (dir) #Next:下一个节点的名称为Getting Started,可以按『N』去到下个节点
#Up:回到上一个的节点画面,可以按『U』回到上一层
#Prev:前一个节点。由于Top是info info的第一个节点,所以上面没有前一个节点的信息
Stand-alone GNU Info
********************
This documentation describes the stand-alone Info reader which you can
use to read Info documentation.
If you are new to the Info reader, then you can get started by typing
'H' for a list of basic key bindings. You can read through the rest of
this manual by typing <SPC> and <DEL> (or <Space> and <Backspace>) to
move forwards and backwards in it.
* Menu:
* Stand-alone Info:: What is Info?
* Invoking Info:: Options you can pass on the command line.
* Cursor Commands:: Commands which move the cursor within a node.
* Scrolling Commands:: Commands for reading the text within a node.
* Node Commands:: Commands for selecting a new node.
* Searching Commands:: Commands for searching an Info file.
* Index Commands:: Commands for looking up in indices.
* Xref Commands:: Commands for selecting cross-references.
* Window Commands:: Commands which manipulate multiple windows.
* Printing Nodes:: How to print out the contents of a node.
* Miscellaneous Commands:: A few commands that defy categorization.
* Variables:: How to change the default behavior of Info.
* Colors and Styles:: Customize the colors used by Info.
-----Info: (info-stnd)Top, 31 lines --Top--------------------------------------------------
Welcome to Info version 6.7. Type H for help, h for tutorial.
Linux系统中不仅是对用户与组根据UID、GID进行了管理,还对Linux系统中的文件,按照用户与组进行分类,针对不同的群体进行了权限管理
,用他来确定谁能通过何种方式对文件和目录进行访问和操作。示意如下:
chmod
改变权限chmod
,change mode缩写。权限设定可采用a)数字;b)符号的形式。
#常用语法:chmod XXX 文件或目录名
roc@ubuntu:~/cmd_study$ ls -l
total 0
-rw-r--r-- 1 ninja ninja 0 Nov 14 22:12 test.txt
roc@ubuntu:~/cmd_study$ chmod 777 test.txt #改变test.txt文件权限
roc@ubuntu:~/cmd_study$ ls -l
total 0
-rwxrwxrwx 1 ninja ninja 0 Nov 14 22:12 test.txt
两个基本概念:
linux下常用的特殊目录符号:
.
代表当前目录
..
代表上一级目录
-
代表前一个工作目录
~
代表『目前使用者身份』所在的home目录
~account
代表 account 这个使用者的home目录(account是个帐号名称)
cd
切换目录全称: change directory
**简述:**用来切换工作目录。
常用语法:cd [相对路径或绝对路径]
示例:
# 常用语法:
roc@ubuntu:~$ cd ~ #回到当前使用者的home目录
roc@ubuntu:~$ cd #没有加上任何路径,也代表回到当前使用者的home目录
roc@ubuntu:~$ cd .. #返回当前目录的上一级目录
roc@ubuntu:~$ cd - #回到刚刚所在的那个目录
roc@ubuntu:~$ cd /var/spool/mail #去到该绝对路径目录下
pwd
显示当前所在的目录全称: print working directory
**简述:**显示目前所在的目录。
常用语法:pwd [-P]
选项或参数
-P :显示出确实的路径,而非使用连接 (link) 路径
示例:
#例一:显示当前目录
roc@ubuntu:~$ pwd
/home/ninja
#例二:-P参数
roc@ubuntu:~$ cd /var/lock/ #/var/lock是一个连接档
roc@ubuntu:/var/lock$ pwd #显示当前连接档所在路径
/var/lock
roc@ubuntu:/var/lock$ pwd -P #显示真实路径
/run/lock
mkdir
创建新目录全称: make directory
**简述:**创建新目录。
常用语法:mkdir [-mp] 目录名称
选项或参数
-m :配置文件的权限
-p :将所需要的目录(包含上一级目录)递归创建起来
示例:
roc@ubuntu:~$ cd cmd_study/
#例一:创建名为test的目录
roc@ubuntu:~/cmd_study$ mkdir test
#例二:-p选项,自行递归创建多层目录
roc@ubuntu:~/cmd_study$ mkdir test1/test2/test3
mkdir: cannot create directory ‘test1/test2/test3’: No such file or directory #没办法直接创建此目录
roc@ubuntu:~/cmd_study$ mkdir -p test1/test2/test3
#例三:创建权限为rwx--x--x的目录
roc@ubuntu:~/cmd_study$ mkdir -m 711 test2
roc@ubuntu:~/cmd_study$ ls -l
total 0
drwxr-xr-x 1 roc ninja 512 Nov 14 22:56 test
drwxr-xr-x 1 roc ninja 512 Nov 14 22:56 test1
drwx--x--x 1 roc ninja 512 Nov 14 22:57 test2 #如果没有加上 -m 来强制配置属性,系统会使用默认属性
rmdir
删除[空]目录全称: remove directory
**简述:**删除目录。被删除的目录里面必定不能存在其他的目录或文件,也就是必须是空目录(empty directory)
。
常用语法:rmdir [-p] 目录名称
选项或参数
-p :连同上一级的『空』目录一起删除
示例:
#接续上一步mkdir所创建的目录
roc@ubuntu:~/cmd_study$ ls -l
total 0
drwxr-xr-x 1 roc ninja 512 Nov 14 22:56 test
drwxr-xr-x 1 roc ninja 512 Nov 14 22:56 test1
drwx--x--x 1 roc ninja 512 Nov 14 22:57 test2
#例一:空目录,可直接删掉
roc@ubuntu:~/cmd_study$ rmdir test
#例二:目录下有内容,无法直接删除
roc@ubuntu:~/cmd_study$ rmdir test1
rmdir: failed to remove 'test1': Directory not empty
roc@ubuntu:~/cmd_study$ rmdir -p test1/test2/test3/
#test与test1已被删除
roc@ubuntu:~/cmd_study$ ls -l
total 0
drwx--x--x 1 ninja ninja 512 Nov 14 22:57 test2
ls
显示指定工作目录下的内容全称: list
**简述:**linux中最常被执行的命令,用于显示文件和目录相关详细详细。
常用语法:ls [-aAdfFhilnrRSt] 目录名称
ls [--color={never,auto,always}] 目录名称
ls [--full-time] 目录名称
选项或参数:
-a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏档,但不包括 . 与 … 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 默认会以档名排序!)
-F :根据文件、目录等资讯,给予附加数据结构,例如:
*:代表可运行档; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
-l :长数据串列出,包含文件的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等於该目录下的所有文件都会显示出来;
-S :以文件容量大小排序,而不是用档名排序;
-t :依时间排序,而不是用档名。–color=never :不要依据文件特性给予颜色显示;
–color=always :显示颜色
–color=auto :让系统自行依据配置来判断是否给予颜色
–full-time :以完整时间模式 (包含年、月、日、时、分) 输出
–time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)
而非内容变更时间 (modification time)
cp
复制文件或目录全称: copy
**简述:**复制文件或目录。复制(cp)这个命令非常重要,不同身份者运行这个命令会有不同的结果产生,尤其是那个-a, -p的选项, 对于不同身份来说,差异则非常的大!
常用语法:
cp [-adfilprsu] 来源档(source) 目标档(destination)
cp [options] source1 source2 source3 .... directory
选项或参数
-a :相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
-d :若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i :若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式连结(hard link)的连结档创建,而非复制文件本身;
-p :连同文件的属性一起复制过去,而非使用默认属性(备份常用);
-r :递回持续复制,用於目录的复制行为;(常用)
-s :复制成为符号连结档 (symbolic link),亦即『捷径』文件;
-u :若 destination 比 source 旧才升级 destination !
最后需要注意的,如果来源档有两个以上,则最后一个目的档一定要是『目录』才行!
rm
删除文件或目录全称: remove
**简述:**删除文件或目录。
常用语法:rm [-fir] 文件或目录
选项或参数
-f :force 的意思,忽略不存在的文件,不会出现警告信息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除,最常用在目录的删除!这是非常危险的选项!!!
mv
移动(或重命名)文件或目录全称: move
**简述:**删除文件或目录。
常用语法:
mv [-fiu] source destination
mv [options] source1 source2 source3 .... directory
选项或参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会升级 (update)
示例:
#例一:复制一文件,创建一目录,将文件移动到目录中
roc@ninja:~$ cd tmp/
roc@ninja:~/tmp$ cp ~/.bashrc bashrc
roc@ninja:~/tmp$ mkdir mvtest
roc@ninja:~/tmp$ mv bashrc mvtest # 将某个文件移动到某个目录去
#例二:将刚刚的目录名称更名为 mvtest2
roc@ninja:~/tmp$ mv mvtest mvtest2
roc@ninja:~/tmp$ ls
mvtest2
#例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中
roc@ninja:~/tmp$ cp ~/.bashrc bashrc1
roc@ninja:~/tmp$ cp ~/.bashrc bashrc2
roc@ninja:~/tmp$ mv bashrc1 bashrc2 mvtest2/
# 注意这里,如果有多个来源文件或目录,则最后一个目标档一定是『目录』!
roc@ninja:~/tmp$ ls mvtest2/
bashrc bashrc1 bashrc2
basename
获取文件名称#例一:获取文件名
roc@ubuntu:~$ basename /etc/apt/sources.list
sources.list
dirname
获取目录名称#例一:获取文件所在目录名
roc@ubuntu:~$ dirname /etc/apt/sources.list
/etc/apt
cat
从前往后显示文件内容全称: concatenate
**简述:**从前往后显示文件内容。
常用语法:cat [-AbEnTv]
选项或参数
-n :后接数字,代表显示几行的意思
-A :显示特殊字符,相当于-vET选项
-b :对非空白行列出行号,空白行不标行号
-E :显示行尾结束字节$
-n :列出行号,空白行也标行号,与 -b 不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :显示正常不可见的特殊字符
示例:
#例一:基础用法
roc@ubuntu:/etc$ cat /etc/issue
Ubuntu 18.04.4 LTS \n \l
#例二:列出行号,包含空白行
roc@ubuntu:/etc$ cat -n /etc/issue
1 Ubuntu 18.04.4 LTS \n \l
2
#例三:列出行尾结束符
roc@ubuntu:/etc$ cat -E /etc/issue
Ubuntu 18.04.4 LTS \n \l$
$
tac
从后往前显示文件内容tac
,cat
指令的反写,功能也同cat
刚好相反,从后往前显示文件内容。
roc@ubuntu:/etc$ tac -n /etc/issue
tac: invalid option -- 'n'
与cat
,tac
等一次性将要查看的文件数据都显示到屏幕上不同,下面介绍的more
、less
指令将为我们提供以滚动翻页的方式来查看文件,这对阅读一些长文本或大文件时比较有帮助。
more
roc@ubuntu:~$ more /etc/sysctl.conf
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#
#kernel.domainname = example.com
# Uncomment the following to stop low-level messages on console
#kernel.printk = 3 4 1 3
##############################################################3
# Functions previously found in netbase
#
# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1
# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
--More--(32%) #当前显示内容的百分比,同时光标会定位在此等待输入命令
如上,若需要显示的文件内容大于当前屏幕所能输出的最大行数时,就会在结尾提示--More--(百分比%)
字符,默认光标也会定位在此,支持的命令如下:
Space
:代表向下翻一页;
Enter
:代表向下翻『一行』;
/字符串
:在当前显示的内容中,向下查找『字符串』这个关键字;
:f
:立刻显示出档名以及目前显示的行数;
q
:代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b
:代表往回翻页,不过这动作只对文件有用,对管道文件无用。
less
提供比more
更加灵活的功能,如使用【pageup】、【pagedown】前后翻看文件,向上查找内容等。
roc@ubuntu:~$ less /etc/sysctl.conf
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#
#...此处省略...
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
: #《==此处输入命令
支持的指令如下:
空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;
备注:
前文提到的man
指令也是通过调用less
来显示说明文件的内容的!
head
从头选取查看全称: head
**简述:**从头开始选取查看指定行数的文件内容
常用语法:head [-n number] 文件
选项或参数
-n :后接数字,代表显示几行的意思
示例:
#例一:默认显示前面十行
roc@ubuntu:~$ head /etc/sysctl.conf
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#
#kernel.domainname = example.com
# Uncomment the following to stop low-level messages on console
#kernel.printk = 3 4 1 3
#例二:指定显示前两行
roc@ubuntu:~$ head -n 2 /etc/sysctl.conf
#
# /etc/sysctl.conf - Configuration file for setting system variables
备注:
-n
选项后面如果接的是负数,如-n -100
时,代表从前往后打印所有行数, 但不包括后面100行。如上,假设/etc/sysctl.conf
共有141行,则命令『head -n -100 /etc/sysctl.conf』
就会打印前面41行,后100行不会打印出来。
tail
从尾选取查看全称: tail
简述:
tail
用法与head
相似,只是默认显示最后几行!
令tail
可以侦测文件的输入,利用-f
选项,tail
可以一直侦测文件是否有写入新的数据,并将其打印到屏幕上。
常用语法:tail [-n number][-f] 文件
选项或参数
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的文件,要等到按下[ctrl]-c才会结束tail的侦测
示例:
#例一:默认显示最后十行
roc@ubuntu:~$ tail /etc/sysctl.conf
#例二:指定显示最后两行
roc@ubuntu:~$ tail -n 2 /etc/sysctl.conf
kernel.printk = 1 4 1 7
kernel.printk = 1 4 1 7
#例三:指定显示第100行后的内容
roc@ubuntu:~$ tail -n +100 /etc/sysctl.conf
#例四:持续侦测/etc/sysctl.conf的内容
roc@ubuntu:~$ tail -f /etc/sysctl.conf
###################################################################
# Protected links
#
# Protects against creating or following links under certain conditions
# Debian kernels have both set to 1 (restricted)
# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt
#fs.protected_hardlinks=0
#fs.protected_symlinks=0
kernel.printk = 1 4 1 7
kernel.printk = 1 4 1 7
| #<<==输入[ctrl+c]结束tail的侦测
od
查看二进制文件全称: Octal Dump。
**简述:**前述命令都是查看文本文件,对于二进制(binary file)文件,用这些命令查看则会显示乱码。此时就需要用到od
命令。
常用语法:od [-t TYPE] 文件
选项或参数:
-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
示例:
#将/usr/bin/passwd文件的内容以ASCII码的方式打印出来
roc@ubuntu:~$ od -t c /usr/bin/passwd
0000000 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 003 \0 > \0 001 \0 \0 \0 J \0 \0 \0 \0 \0 \0
0000040 @ \0 \0 \0 \0 \0 \0 \0 8 342 \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 @ \0 8 \0 \t \0 @ \0 033 \0 032 \0
#...后面省略...
#将/etc/issue这个文件的内容以16进制列出储存值与ASCII的对照表
roc@ubuntu:~$ od -t xCc /etc/issue
0000000 55 62 75 6e 74 75 20 31 38 2e 30 34 2e 34 20 4c
U b u n t u 1 8 . 0 4 . 4 L
0000020 54 53 20 5c 6e 20 5c 6c 0a 0a
T S \ n \ l \n \n
0000032
touch
修改文件时间或创建文件全称: touch
简述:
创建一个空的文件;
将某个文件日期修订为目前 (mtime 与 atime)。linux下每个文件都会记录许多时间参数,其中最重要的有如下三个:
- modification time (mtime):当该文件的『内容数据』变更时,就会升级这个时间
- status time (ctime):当该文件的『状态 (status)』(如权限、属性等)改变时,就会升级这个时间
- access time (atime):当『该文件的内容被读取』时,就会升级这个时间
常用语法:touch [-acdmt] 文件
选项或参数:
-a :仅修订 access time; -c :仅修改文件的时间,若该文件不存在则不创建新文件; -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间" -m :仅修改 mtime ; -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]
示例:
#例一:新建一个空文件并观察其时间
roc@ubuntu:~$ mkdir tmp
roc@ubuntu:~$ cd tmp/
roc@ubuntu:~/tmp$ touch testtouch
roc@ubuntu:~/tmp$ ll testtouch; ll --time=atime testtouch; ll --time=ctime testtouch
-rw-r--r-- 1 roc sudo 0 Nov 17 21:04 testtouch
-rw-r--r-- 1 roc sudo 0 Nov 17 21:04 testtouch
-rw-r--r-- 1 roc sudo 0 Nov 17 21:04 testtouch
# 注意该文件的大小是 0 。
# 默认状态下,如果 touch 后面有接文件,则该文件的三个时间 (atime/ctime/mtime) 都会升级为目前的时间;
# 若该文件不存在,则会主动的创建一个新的空文件。
#例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期
roc@ubuntu:~/tmp$ cp -a ~/.bashrc bashrc
roc@ubuntu:~/tmp$ ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 roc sudo 3771 Nov 13 20:45 bashrc #mtime
-rw-r--r-- 1 roc sudo 3771 Nov 17 10:40 bashrc #atime
-rw-r--r-- 1 roc sudo 3771 Nov 17 21:05 bashrc #ctime
#数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。
#但由于这个文件是刚刚被创建的,因此状态(ctime)与读取(atime)时间就呈现复制时的时间
#例三:修改例二的 bashrc 文件,将日期调整为两天前
roc@ubuntu:~/tmp$ touch -d "2 day ago" bashrc
roc@ubuntu:~/tmp$ ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 roc sudo 3771 Nov 15 21:12 bashrc
-rw-r--r-- 1 roc sudo 3771 Nov 15 21:12 bashrc
-rw-r--r-- 1 roc sudo 3771 Nov 17 21:12 bashrc
#与例二相比,atime/mtime的时间都变成了15号,但ctime并没有变化
#例四:将上个范例的 bashrc 日期改为 2007/09/15 2:02
roc@ubuntu:~/tmp$ touch -t 0709150202 bashrc
roc@ubuntu:~/tmp$ ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 roc sudo 3771 Sep 15 2007 bashrc
-rw-r--r-- 1 roc sudo 3771 Sep 15 2007 bashrc
-rw-r--r-- 1 roc sudo 3771 Nov 17 21:13 bashrc
#注意:日期在 atime 与 mtime 都改变了,但是 ctime 仍是记录目前的时间!
备注:
即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status) 被改变的时间。
平时看文件属性时,比较重要的还是属于 mtime
!普遍关心的常常是这个文件的『内容』 是什么时候被更动。