第2周课程练习
1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
1.1、ls
ls: list列出目录内容,显示指定路径下的文件列表;
格式
ls [OPTION]… [DIR]…
常用选项:
-a, –all: 显示所有文件,包括隐藏文件;
-l: 长格式
-rw-r–r– 1 root root 44800 Aug 14 14:32 install.log
-rw-r–r–
最左侧的第一位:文件类型
-, d, l, b, c, p, s
后面的9位:访问权限,perm
文件被硬链接的次数 文件的owner 文件的group 文件的size 文件的最近一次被修改的时间 文件名
-h, –human-readable:单位换算
-d: 显示目录自身的相关属性;通常要与-l一起使用;
-r, –reverse: 逆序显示
-R, –recursive: 递归
1.2、cd
cd: 改变shell的工作目录,内部命令
cd 或 cd ~: 回当前用户的主目录
cd ~USERNAME: 切换至指定用户的主目录
cd -: 在上一个目录和当前目录之间来回切换
1.3、文件内容类型查看命令file
file:用于查看普通文件和系统文件的类型
格式:
file /PATH/TO/SOMEWHERE
常用选项:
-b:列出文件辨识结果时,不显示文件名称
-i:输出mime类型的字符串
1.4、文件查看命令cat、tac、more、less、head、tail
cat:连接并显示文件的信息,是全部显示文件内的信息
cat [OPTION]… [FILE]…
-E: 显示行结束符$
-n: 对显示出的每一行进行编号
tac:反向输出文件内容
more:more的作用同cat是相同的,只不过这时我们可以通过手动来翻屏,更加方便. 只支持向后翻,翻到最后就直接退出
more [OPTIONS…] FILE…
-d: 显示翻页及退出提示
less: 显示文件信息,默认不退出显示,q即可退出
less [OPTIONS…] FILE…
空格:向后翻一屏
b:向前翻一屏
ENTER:向后翻一行
k:向前翻一行
关键字查找: /KEYWORD:查找关键字
head:显示文件的前几行,默认是10行
head [OPTION]… [FILE]…
-c #: 指定获取前#字节
-n #: 指定获取前#行
tail:显示文件的后几行,默认是10行
tail [OPTION]… [FILE]…
-c #: 指定获取后#字节
-n #: 指定获取后#行
-f: 跟踪显示文件新追加的内容;
1.5、tree:以目录树的形式显示目录
-d: 只显示目录
-L level:指定显示的层级数目
-P pattern: 只显示由指定pattern匹配到的路径;
1.6、目录创建删除mkdir、rmdir
mkdir:创建目录
mkdir [options] /path/to/somewhere
-p: 递归,存在也不报错,且可自动创建所需的各目录;
-v: 显示详细信息
-m MODE: 创建目录时直接指定权限;
rmdir:删除空目录
rmdir [OPTION]… DIRECTORY…
-v: 显示过程;
-r:递归删除
-f:强行删除
1.7、文件的时间戳管理工具touch
文件:是由metadata和data组成
查看文件状态:stat
三个时间戳:
access time:访问时间,简写为atime,读取文件内容
modify time: 修改时间, mtime,改变文件内容(数据)
change time: 改变时间, ctime,元数据发生改变
touch命令:创建文件
touch [OPTION]… FILE…
-a: only atime只改变文件的访问时间
-m: only mtime只改变文件的修改时间
-t STAMP: 只改变文件的修改时间
[[CC]YY]MMDDhhmm[.ss]
-c: 如果文件不存,则不予创建
1.8、文件管理类命令cp、mv、rm
复制命令:cp文件复制
cp [OPTION]… [-T] SOURCE DEST
cp [OPTION]… SOURCE… DIRECTORY
cp [OPTION]… -t DIRECTORY SOURCE…
法则:
1、cp SRC DEST
SRC是文件:如果目标不存在:新建DEST,并将SRC中内容填充至DEST中;如果目录存在:如果DEST是文件:将SRC中的内容覆盖至DEST中;此时建议为cp命令使用-i选项;如果DEST是目录:在DEST下新建与原文件同名的文件,并将SRC中内容填充至新文件中;
2、cp SRC… DEST
SRC…:多个文件:DEST必须存在,且为目录,其它情形均会出错;
3、cp SRC DEST
SRC是目录:此时一定要使用选项:-r。如果DEST不存在:则创建指定目录,复制SRC目录中所有文件至DEST中;如果DEST存在:如果DEST是文件:报错;如果DEST是目录:复制SRC目录中所有目录至DEST目录下。
常用选项:
-i:交互式
-r, -R: 递归复制目录及内部的所有内容;
-a: 归档,相当于-dR –preserv=all
-d:–no-dereference –preserv=links 复制时保留原来的样子(不追踪符号链接)
–preserv[=ATTR_LIST]:mode: 权限;ownership: 属主属组;timestamp: 时间戳;links链接属性;xattr:扩展属性;context:安全上下文all:所有
-p: –preserv=mode,ownership,timestamp
-v: –verbose,显示过程
-f: –force:强制复制,覆盖
mv: move,移动文件或重命名文件
mv [OPTION]… [-T] SOURCE DEST
mv [OPTION]… SOURCE… DIRECTORY
mv [OPTION]… -t DIRECTORY SOURCE…
常用选项:
-i: 交互式
-f: 强制
法则:
1、source是个文件:如果dest存在且是个文件,将source的内容填充至存在的文件中,且删除source的文件(覆盖);dest是个目录,则在目标目录下创建一个于源文件同名的文件。如果dest不存在,则以指定的名字命名,将source的内容填充,然后删除源文件
2、source是多个文件:则目标必须存在,且是一个目录
3、source是个目录:不加以区分目录和文件(同一个目录下操作相当于重命名)
rm: remove,删除
rm [OPTION]… FILE…
常用选项:
-i: 交互式
-f: 强制删除
-r: 递归
rm -rf:强制删除指定目录及目录下所有文件
–preserve-root:默认不允许删除根
2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
2.1、命令执行状态返回值
程序执行有两类结果:
程序的返回值;
程序的执行状态结果;
在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结束时,都会返回一个数字值,这个值叫做返回值,或者称为错误号 ( Error Number )。
只要返回值是 0,就代表程序执行成功
如果 $? 变量的值不是 0 的话,就表示上一个命令在执行的过程中出错了。1-255都表示失败。
2.2、命令行展开
2.2.1、花括号展开
在非引号内的内容,如果用花括号包括,而且里面用逗号分隔(至少包含一个逗号,可以是空内容),这样花括号里的内容会被展开成用空格分开的一个列表,花括号前后可以紧随前缀和后缀(前后缀都是可选的)。
2.2.2、波浪号展开
从波浪号~到第一个未被引号包含的斜杠/(如果没有斜杠,则全部算上),作为波浪号前缀。在波浪号后面的字符串作为一个可能的登录名:如果为空,被展开成该用户的HOME变量,如果HOME变量未设置,则用用户执行shell的主目录替换。如果不为空,则按照该登录名的主目录替换
~: 展开为用户的主目录
~USERNAME:展开为指定用户的主目录
2.2.3、Shell参数和变量展开
用$符号开始,后面接着变量名或者花括号括起来的变量名,如果是花括号内以叹号开头,那么就是变量名本身。
echo $PWD # 显示PWD对应的值
echo ${PWD} # 显示PWD对应的值
echo ${!PWD} # 显示“PWD”这个变量名,而不是它的值
echo ${!P*} # 显示所有以P开头的环境变量名
如果一个变量名不存在,就创建它。
echo ${HELLO:=hello} # 如果HELLO不存在,就用hello给它赋值,否则直接输出$HELLO的值
3、请使用命令行展开功能来完成以下练习:
(1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
touch /tmp/{a,b}_{c,d}
(2)、创建/tmp/mylinux目录下的:
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └── network-scripts
├── lib
│ └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│ └── local
│ ├── bin
│ └── sbin
└── var
├── lock
├── log
└── run
mkdir -p /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
4、文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息。
任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode…)等等。
元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。事实上,这个所谓的元数据就包含在inode中。我们可以用$ls -l来查看这些元数据。正如我们上面看到的,inode所占据的区域与数据块的区域不同。每个inode有一个唯一的整数编号(inode number)表示。
在保存元数据,inode是“文件”从抽象到具体的关键。inode储存有一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。
inode并不是组织文件的唯一方式。最简单的组织文件的方法,是把文件依次顺序的放入存储设备,DVD就采取了类似的方式。但如果有删除操作,删除造成的空余空间夹杂在正常文件之间,很难利用和管理。
复杂的方式可以使用链表,每个数据块都有一个指针,指向属于同一文件的下一个数据块。这样的好处是可以利用零散的空余空间,坏处是对文件的操作必须按照线性方式进行。如果想随机存取,那么必须遍历链表,直到目标位置。由于这一遍历不是在内存进行,所以速度很慢。
FAT系统是将上面链表的指针取出,放入到内存的一个数组中。这样,FAT可以根据内存的索引,迅速的找到一个文件。这样做的主要问题是,索引数组的大小与数据块的总数相同。因此,存储设备很大的话,这个索引数组会比较大。
inode既可以充分利用空间,在内存占据空间不与存储设备相关,解决了上面的问题。但inode也有自己的问题。每个inode能够存储的数据块指针总数是固定的。如果一个文件需要的数据块超过这一总数,inode需要额外的空间来存储多出来的指针。
例如:在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat /var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。
在Linux下,可以使用$stat filename,来查询某个文件对应的inode编号。
在存储设备中实际上存储为:
当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。
使用stat /PATH/TO/SOMEFILE来获取指定文件的元数据
Access:最后访问时间
Modify:最后修改时间
Change:状态更改时间(由系统维护,无法随意修改)
touch -a :仅更新Access time(同时更新Change为current time)
touch -m:仅更新Modify time(同时更新Change为current time)
touch -c:不创建新文件
touch -t:使用指定的时间更新时间戳(仅更改Access time与Modify time,Change time更新为current time)
5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
5.1定义别名
命令别名,通过alias命令实现:
(1)alias:显示当前shell进程所有可用的命令别名;
(2)alias NAME='VALUE'
定义别名NAME,其相当于执行命令VALUE;
注意:
在命令行中定义的别名,仅对当前shell进程有效;如果想永久有效,要定义在配置文件中;
仅对当前用户:~/.bashrc
对所有用户有效:/etc/bashrc
bash进程重新读取配置文件:
source /path/to/config_file
./path/to/config_file
撤消别名:unalias
unalias [-a] name [name …]
如果别名同原命令的名称,则如果要执行原命令,可使用"\COMMAND";
5.2、命令引用
5.2.1、命令引用和替换(通过变量的方式)
引用:就是指将字符串用引用符号括起来,以防止特殊字符被shell脚本解释为其他意义。引用时屏蔽特殊字符的特殊意义,而将其解释为字面意义。
替换:将命令的标准输出作为值赋给某个变量,bash Shell定义了两种形式进行命令的替换,两种形式的语法格式如下:
方式一: `COMMAND`
方式二: $(COMMAND)
5.2.2、管道和重定向
重定向:通常在Shell命令中最常见到三种输入输出类型,标准输入(stdin),标准输出(stdout)以及标准错误输出(stderr),感觉跟C/C++里边文件划分类似。 stdin一般指command接受的输入流,stdout指command正常输出情况,默认输出显示到终端,stderr则是command的错误输出,默认也是输出显示到终端。 而文件描述符则是与一个打开的文件或数据流相对应的一个整数,系统将0,1,2分别与标准输入,标准输出以及标准错误输出相对应。
1)输出重定向:
重定向符号>以及>>意为输出重定向,包括标准输出以及标准错误输出,也是一般命令中比较常见的情况,与stdout及stderr两两组合就是四种情况
1>表示标准输出重定向,覆盖
1>>表示标准输出重定向,追加
2>表示标准错误输出重定向,覆盖
2>> 表示标准错误输出重定向,追加
标准输出和错误输出各自定向至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向:
&>:覆盖重定向
&>>:追加重定向
2)输入重定向:
和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
command < file
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
Here Document
Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式
# cat << EOF
# cat > /path/to/somefile << EOF
它的作用是将两个EOF 之间的内容(document) 作为输入传递给 command。
注意:
结尾的EOF 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
tr命令:转换或删除字符
格式:tr [OPTION]… SET1 [SET2]
-d:可以实现删除出现在字符集中的所有字符
3)管道:
COMMAND1 | COMMAND2 | COMMAND3 |…
最后一个命令会在当前shell进程的子shell进程中执行;
6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
# ls -d /var/l*[0-9]*[a-z]
7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
# ls -d /etc/[0-9]*[^0-9]
8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
# ls -d /etc/[^[:alpha:]][[:alpha:]]*
9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
mkdir /tmp/tfile-`date +%Y-%m-%d-%H-%M-%S`
10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
# mkdir /tmp/mytest1
# cp -r /etc/p*[^[:digit:]] /tmp/mytest1
11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
# mkdir /tmp/mytest2
# cp -r /etc/*.d /tmp/mytest2
12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。
# mkdir /tmp/mytest3
# cp -r /etc/[lmn]*.conf /tmp/mytest3
原创文章,作者:N21_我爱罗,如若转载,请注明出处:http://www.178linux.com/22254
评论列表(1条)
写的很好,排版还可以在漂亮一点,就不要贴黑屏的截图了,加油