您的位置:首页 > 博客中心 > 网络系统 >

Linux文件类型和文件相关命令

时间:2022-04-03 13:56

文件类型

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 [root@centos7 app]# dirname /etc/sysconfig/network-scripts/ifcfg-ens192 /etc/sysconfig/network-scripts [root@centos7 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:长格式信息,列出文件的详细属性,命令可以简写为llalias 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 [root@CentOS6 app]# cat /etc/issue CentOS release 6.9 (Final) Kernel \r on an \m   [root@CentOS6 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 [root@centos7 ~]# 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]:匹配列表中的任何的一个字符,匹配wang

  • [^wang] 匹配列表中的所有字符以外的字符,除了wang

只显示隐藏文件:

预定义的字符类: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/y1test1/x/y2test1/x/y1/atest1/x/y1/b

练习2: test2目录下面创建a_ca_d,b_cb_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=2048vim bigfile,在vim模式下不要退出。

打开另外一个会话窗口,删除文件,结果发现,文件是删除了,但是空间没有释放,因为vim占用着文件。

这时候我们就可以用>来搞定:

1 2 > bigfile3 rm -rf bigfile3

> 和>>开单章讲,在后面的IO和重定向部分。

本类排行

今日推荐

热门手游