文件类型
ll
后可以看到文件详情:
-
:常规文件(内部类型是什么,用file
命令)
d
:directory,目录文件
b
:blobk device,块设备文件,支持以“block”为单位进行随机访问
-
major number:主设备号,用来表示设备类型,进而确定要加载的驱动程序
-
minor number:次设备号,用于表示同一类型中的不同设备。
如下图的1,3
、1,5
c
:character device,字符设备文件,支持以”character”为单位进行线性访问
l
:symbolic link,符号链接文件(软连接文件)
p
:pipe,命名管道
s
:socket,套接字文件
路径
绝对路径:以斜线开始的,从/
开始的路径。
/etc/syscofnig/network-scrpits
绝对路径分为两段,dirname和basename:
1
2
3
4
|
[[email protected] app]# dirname /etc/sysconfig/network-scripts/ifcfg-ens192
/etc/sysconfig/network-scripts
[[email protected] app]# basename /etc/sysconfig/network-scripts/ifcfg-ens192
ifcfg-ens192
|
相对路径:不以斜线开始的路径。
xxx/yyy
:当前目录下的xxx子目录的yyy子目录.
:当前目录..
:上级目录~
:用户的家目录-
:切换上次输入的目录,和命令配合使用
tips:
-
原理,系统记住上一个工作目录,存储在环境变量OLDPWD
,可以用echo $OLDPWD
查看到。
常用命令:
1. pwd
:显示工作目录
printing working directory
2. cd
:切换目录
change directory
-
cd
:切换到家目录 -
cd ~
:切换到家目录 -
cd ~USERNAME
:切换到用户USERNAME的家目录 -
cd -
:在上一次所在目录与当前目录来回切换(PWD to OLDPWD) -
cd ..
:切换到上级目录 -
cd /path/to/directory
切换到一个绝对目录 -
cd path/to/directory
:切换到一个相对目录
3. ls
:列出内容
list(用/var目录做例子)
-
-a
,--all
:列出所有文件包含隐藏文件 -
-A
,--almost-all
:列出除.
和..
之蛙所有的文件 -F
:-F参数在目录名后加了正斜线(/),以方便用户在输出中分辨它们。类似地,它会在可执行 文件(比如上面的my_script文件)的后面加个星号,以便用户找出可在系统上运行的文件。
-
l
,--long
:长格式信息,列出文件的详细属性,命令可以简写为ll
,alias ll=‘ls -l --color=auto‘
-
-h
,--human-readable
:size用人类可读的格式表示 -
-d
,--directory
:查看目录本身而非内部的文件详情 -
-r
,--reverse
:反转排序(降序) -R
,--recursive
递归显示(基本不用这个,递归显示用tree
命令更直观)-t
:按修改时间排序
4. cat
:文本文件输出到终端
concatenate
拼接
可以单独cat:cat /etc/issue
可以连接多个文件显示cat /etc/issue /etc/redhat-release
1
2
3
4
5
6
7
8
9
|
[[email protected] app]# cat /etc/issue
CentOS release 6.9 (Final)
Kernel \r on an \m
[[email protected] app]# cat /etc/issue /etc/redhat-release
CentOS release 6.9 (Final)
Kernel \r on an \m
CentOS release 6.9 (Final)
|
参数:
cat -s file
:删除多余的空白行(多行空白行,删除到只剩一行空白行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
$ cat multi_blanks.txt
line 1
line2
line3
line4
$ cat -s multi_blanks.txt #压缩相邻的空白行
line 1
line2
line3
line4
|
cat -T file
:将制表符显示为^I
用来看脚本里的制表符,通常我们写脚本要避免用制表符,而用多个空格。所以此命令通常用来查询哪里用了制表符。
cat -n file
:显示行号
1
2
3
4
5
6
7
8
9
|
$ cat lines.txt
line
line
line
$ cat -n lines.txt
1 line
2 line
3 line
|
5. tac
: 跟cat
相反,从后面行往前面行输出
stat
查看文件状态
可以看到atime(Access)
、mtime(Modify)
、Ctime(Change)
,还有文件的权限,文件拥有者和拥有组,还有文件大小相关的内容。
1
2
3
4
5
6
7
8
9
10
|
[[email protected] ~]# stat /etc/issue
File: ‘/etc/issue’
Size: 23 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 134320235 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2017-05-22 09:07:34.832999490 +0800
Modify: 2016-11-30 02:12:59.000000000 +0800
Change: 2017-05-17 16:53:20.670996867 +0800
Birth: -
|
6. 文件通配符(globbing)
-
*
:匹配零个或多个字符 -
?
:匹配任何单个字符 -
~
:当前用户家目录 -
~longdream
:用户longdream的家目录 -
~+
:当前工作目录 -
~-
:前一个工作目录 -
[0-9]
:匹配数字范围,匹配一个 -
[a-z]或[A-Z]
:字母,不区分大小写tips:因为不区分大小写,[a-d]代表的就是匹配
AaBbCcDd
中的一个 -
[a-z0-9]
:字母或数字 -
[wang]
:匹配列表中的任何的一个字符,匹配w
或a
或n
或g
-
[^wang]
匹配列表中的所有字符以外的字符,除了w
、a
、n
、g
只显示隐藏文件:
预定义的字符类:man 7 glob
[:digit:]
:任意数字,相当于0-9
[:lower:]
:任意小写字母
[:upper:]
: 任意大写字母
[:alpha:]
: 任意大小写字母
[:alnum:]
:任意数字或字母
[:blank:]
:水平空白字符
[:space:]
:水平或垂直空白字符
[:punct:]
:标点符号
[:print:]
:可打印字符
[:cntrl:]
:控制(非打印)字符
[:graph:]
:图形字符
[:xdigit:]
:十六进制字符
练习
练习1:显示/var/log
目录下所有以l
开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录。
练习2:显示/etc
目录下,以任意一位数字开头,且以非数字结尾的文件或目录。
练习3:显示/etc
目录下,以非字母开头,后面跟一个字母及其他任意长度任意字符的文件或目录。
练习4:复制/etc
目录下,所有以m开头,以非数字结尾的文件或目录到/tmp/test
目录。
练习5:复制/usr/share/man
目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/test/man
目录下。
练习6:复制/etc目录下,所有以.conf
结尾,且以m,n,r,p开头的文件或目录到/tmp/conf.d/目录下。
答案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
ls -d /var/l?[[:lower:]]
ls -d /etc/[0-9]*[^0-9]
ls -d /etc/[^a-z][a-z]*
mkdir /tmp/test
cp -r /etc/m*[^0-9] /tmp/test/
mkdir /tmp/test/man
cp -r /usr/share/man/man[0-9] /tmp/test/man
mkdir /tmp/conf.d
cp -r /etc/[mnrp]*.conf /tmp/conf.d/
|
7. touch
touch [OPTION]... FILE...
-a
:仅改变 atime和ctime
-m
:仅改变 mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss]
:指定atime和mtime的时间戳
-c
:如果文件不存在,则不予创建
9. cp
cp
:copy
cp /etc/fstab /app
:复制单个文件到目录下面。cp /etc/{fstab,issue} /app/dir/
,cp /etc/fstab /etc/bashrc /app/dir/
:复制多个文件到某目录下。cp /etc/fstab /app/1.txt
:复制并覆盖目标文件(没有则创建)。
参数
-f
,--force
:强制覆盖目标文件。-r
,-R
,`--recursive
:递归复制目录 (-r
==-R
)。cp -r /var/log /app/log
-d
:复制符号链接本身,而不是他指向的文件。cp -d /etc/system-release /app
-a
,--archive
:归档,等同于-dr
-p
:复制文件的原来属性,等同于下面的--preserv=[mode,ownership,timestamp]
--preserv[=ATTR_LIST]
mode
:权限ownership
:属主属组timestamp
:时间戳links
:复制链接的源文件xattr
context
all
-v
,--verbose
:看到详细信息
练习:
1) 定义别名命令baketc
,每天将/etc/
目录下所有
文件,备份到/testdir
独立的子目录下,并要求子目 录格式为 backupYYYY-mm-dd
,备份过程可见
2) 创建/testdir/rootdir
目录,并复制/root
下所有 文件到该目录内,要求保留原有权限
解答:
1)
1
|
alias baketc=cp -av /etc/* /testdir/`date -u`
|
2)
1
|
cp -ap /root/* /testdir/rootdir
|
tips: 小技巧 利用通配符来复制:
cp -a /etc/passwd{,.bak}
相当于cp -a /etc/passwd /etc/passwd.bak
10. mv
mv
:move
-f
强制移动或覆盖
移动文件(不在同一目录下),重命名文件(在同一目录下)
移动目录或重命名目录
11. rename
重命名后缀
rename [options] expression replacement file...
选项
1
2
3
4
5
6
7
8
9
10
11
|
EXAMPLES
Given the files foo1, ..., foo9, foo10, ..., foo278, the commands
rename foo foo0 foo?
rename foo foo0 foo??
will turn them into foo001, ..., foo009, foo010, ..., foo278. And
rename .htm .html *.htm
will fix the extension of your html files.
|
1
2
3
4
|
mkdir test
cd text
touch {1,2,3,4,5}.txt
rename -v .txt .txt.bak *.txt
|
rm
rm
: remove
删除文件-i
:interactive,交互式-r
递归删除-f
强制删除
rm -rf /
(5是可以删除根的,6和7是不可以删除的)
我们可以留一个习惯:
不用的文件,不要直接删除,可以用mv
move到某个专用目录(比如都移动到/tmp下)
12. tree
参数:
-
-d
: 只显示目录 -
-L level
:指定显示的层级数目 -
-P pattern
: 只显示由指定pattern匹配到的路径
13. mkdir、rmdir
mkdir
:make directory
-p
递归创建-v
:verbose,创建目录的详情-m
mode,权限
rmdir
:remove empty directory(只能删除空目录)
练习1:创建test1/x/y1
, test1/x/y2
, test1/x/y1/a
, test1/x/y1/b
练习2: test2目录下面创建a_c
, a_d
,b_c
, b_d
练习3:在test3目录下创建以下目录结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
test3
├── bin
├── etc
│ └── sysconfig
│ └── network-scripts
├── sbin
├── usr
│ ├── bin
│ ├── lib
│ ├── lib64
│ ├── local
│ │ ├── bin
│ │ ├── etc
│ │ ├── lib
│ │ └── sbin
│ └── sbin
└── var
├── cache
├── log
└── run
|
练习3:创建/testdir/dir1/x
, /testdir/dir1/y,
/testdir/dir1/x/a
, /testdir/dir1/x/b
, /testdir/dir1/y/a
, /testdir/dir1/y/b
练习4:创建/testdir/dir2/x
, /testdir/dir2/y
, /testdir/dir2/x/a
, /testdir/dir2/x/b
练习5:创建/testdir/dir3
, /testdir/dir4
, /testdir/dir5
, /testdir/dir5/dir6
, /testdir/dir5/dir7
答案:
1
2
3
4
5
6
7
8
9
10
11
12
|
mkdir -pv test1/x/{y1/{a,b},y2}
mkdir -pv test2/{a,b}{c,d}
mkdir -pv test3/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib},lib,lib64},var/{cache,log,run}}
mkdir -pv /testdir/dir1/{x,y}/{a,b}
mkdir -pv /testdir/dir2/{x/{a,b},y}
mkdir -pv /testdir/dir{3,4,5/dir{6,7}}
|
14. 延伸
删除大文件的方法(没被释放删除,空间还占用的文件):
实验:
在一个会话下,dd if=/dev/zero of=bigfile bs=1M count=2048
,vim bigfile
,在vim模式下不要退出。
打开另外一个会话窗口,删除文件,结果发现,文件是删除了,但是空间没有释放,因为vim占用着文件。
这时候我们就可以用>
来搞定:
1
2
|
> bigfile3
rm -rf bigfile3
|
>
和>>
开单章讲,在后面的IO和重定向部分。