linux命令-文件目录管理

一、文件/目录查询结果显示

ls 显示文件/目录基本列表

**常用的选项有: **

$ ls -F     #轻松区分文件和目录,目录的最后有"/"
$ ls -a     #显示隐藏文件
$ ls -R     #递归方式显示目录内的所有文件/目录
$ ls -l     #显示每个文件的相关信息,如文件类型、权限、硬链接总数、属主、属组、修改时间等
$ ls -i     #显示文件的inode编号

常见的文件类型包括普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)。

file 查看文件类型

file命令可以查看文件是什么类型,如目录,二进制文件,链接文件,脚本文件,可执行文件等。

$ file a                  #a为目录
a: directory
$ file test_three         #test_three为空文件
test_three: empty
$ echo aa > test_three    #将aa字符串写入test_three文件
$ file test_three         #test_three为二进制文件
test_three: ASCII text
$ file a.sh               #a.sh为脚本文件
a.sh: Bourne-Again shell script, ASCII text executable
$ file /bin/rar           #/bar/rar为二进制可执行文件
/bin/rar: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.15, BuildID[sha1]=aa2e0c518e5d0025864a8afdd6101d04c86ad3ef, stripped

cat 显示文本文件的内容

$ cat test_three       #查看test_three文件的内容
a

d       d
$ cat -n test_three    #查看test_three文件的内容,并显示行号
     1  a
     2
     3  d       d
$ cat -b test_three    #查看test_three文件的内容,并给有文本的行显示行号
     1  a

     2  d       d
$ cat -T test_three    #查看test_three文件的内容,将制表符用^I字符替换
a

d^Id

more 分页显示文本文件的内容

cat命令是一次性显示文本文件的全部内容,因此,对于长文本文件来说,只能看到屏幕上最后面的内容。而more命令则可以分屏显示,也就是每次显示一屏的文字。

$ cat /etc/bash.bashrc
$ more /etc/bash.bashrc

less 更加自主控制所显示的文本文件的内容

less提供一些移动文字的快捷键,如b/u可以往前翻,d/y可以往后翻,q表示退出显示,等等。

$ less /etc/bash.bashrc 

tail 显示文件末尾内容,默认10行

$ tail /etc/bash.bashrc 
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi
$ tail -n 5 /etc/bash.bashrc  #-n 5可以用-5替代
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi

head 显示文件开头部分内容,默认10行

$ head /etc/bash.bashrc 
# System-wide .bashrc file for interactive bash(1) shells.

# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
$ head -5 /etc/bash.bashrc 
# System-wide .bashrc file for interactive bash(1) shells.

# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.

grep 从文件中按“行”提取符合匹配模式的文本内容

语法: grep [选项] 模式 文本对象

选项

  -i, --ignore-case         忽略<模式>大小写
  -w, --word-regexp         强制<模式>仅完全匹配字词
  -x, --line-regexp         强制<模式>仅完全匹配整行
  -z, --null-data           数据行以一个 0 字节结束,而非换行符
  -s, --no-messages         不显示错误信息
  -v, --invert-match        反向选择,即选中不匹配的行
  -V, --version             显示版本信息并退出
  -n, --line-number         输出的同时打印行号
  -c, --count               只打印每个<文件>中的匹配<模式>的行数目
$ sudo cat /etc/sudoers | grep -v '#' | grep -v '^$'   #显示/etc/sudoers文件中不包含'#'的行和空行

cut 对格式化的文本进行指定内容输出

对于某些有分割符的文件,可以通过分隔符来显示指定位置的文本。如果没有指定文件,或者文件为"-",则从标准输入读取输入字符。

常用选项

  -d, --delimiter=分界符      	使用指定分界符代替制表符作为区域分界
  -b, --bytes=列表           	只选中指定的这些字节
  -c, --characters=列表       	只选中指定的这些字符
  -f, --fields=LIST          	只选中指定的这些域;还打印不包含分隔符的任何行,除非指定了-s选项
  -s, --only-delimited          不打印没有包含分界符的行

**-b, -c 或-f 参数格式表示范围如下: **

  • N 从第1个开始数的第N个字节、字符或域
  • N- 从第N个开始到所在行结束的所有字符、字节或域
  • N-M 从第N个开始到第M个之间(包括第M个)的所有字符、字节或域
  • -M 从第1个开始到第M个之间(包括第M个)的所有字符、字节或域
$ cut -d : -f 1,2,4 /etc/passwd   
root:x:0
daemon:x:1
bin:x:2
...省略...

wc 统计文本文件的行数、字数、字节数

$ wc /etc/bash.bashrc 
  71  329 2319 /etc/bash.bashrc

stat 查看文件的存储细节和时间参数

$ stat /etc/bash.bashrc 
  文件: /etc/bash.bashrc
  大小: 2319            块: 8          IO 块: 4096   普通文件
设备: 804h/2052d        Inode: 5243317     硬链接: 1
权限: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
最近访问: 2022-03-18 09:11:50.556627063 +0800
最近更改: 2020-02-25 20:03:22.000000000 +0800
最近改动: 2021-12-31 16:25:12.904966474 +0800
创建时间: -

sort 对文本内容进行排序后显示(不改变原文本内容)

语法: sort [选项] 文件名

选项

  -b, --ignore-leading-blanks   忽略前导的空白区域
  -d, --dictionary-order        只考虑空白区域和字母字符
  -f, --ignore-case             忽略字母大小写  
  -g, --general-numeric-sort    按一般数字排序
  -h, --human-numeric-sort      使用易读性数字(例如:  2K 1G)
  -M, --month-sort              按月份排序 (unknown) < 'JAN' < ... < 'DEC'
  -n, --numeric-sort            按数字排序
  -R, --random-sort             随机排序
  -V, --version-sort            在文本内进行自然版本排序
  -r, --reverse                 反向排序
      --sort=WORD               按照WORD 指定的格式排序: 一般数字-g,高可读性-h,月份-M,数字-n,随机-R,版本-V
  -u, --unique                  配合-c,严格校验排序;不配合-c,则只输出一次排序结果
  -c, --check, --check=diagnose-first   检查输入是否已排序,若已有序则不进行操作
  -t, --field-separator=分隔符   使用指定的分隔符代替非空格到空格的转换
  -V, --version-sort            在文本内进行自然版本排序

uniq 去重显示文件内容

uniq,unique的缩写,可以去除文本中连续的重复行并输出(不改变原文本内容),但不连续的重复行将不予处理

diff 比较文件之间内容的差异

二、文件/目录管理

touch 创建空文件

touch filename #不存在即创建空文件,存在即改变文件的修改时间

$ pwd                 #查看当前目录
/home/hollowman/shellstudy
$ touch test_one      #创建空文件
$ stat test_one   #查看文件时间信息
  文件: test_one
  大小: 0         	块: 0          IO 块: 4096   普通空文件
设备: 804h/2052d	Inode: 4468041     硬链接: 1
权限: (0664/-rw-rw-r--)  Uid: ( 1000/hollowman)   Gid: ( 1000/hollowman)
最近访问: 2022-03-17 14:04:23.133578989 +0800
最近更改: 2022-03-17 14:04:23.133578989 +0800
最近改动: 2022-03-17 14:04:23.133578989 +0800
创建时间: -
$ touch test_one #改变文件的修改时间
$ stat test_one 
  文件: test_one
  大小: 0         	块: 0          IO 块: 4096   普通空文件
设备: 804h/2052d	Inode: 4468041     硬链接: 1
权限: (0664/-rw-rw-r--)  Uid: ( 1000/hollowman)   Gid: ( 1000/hollowman)
最近访问: 2022-03-17 14:05:49.624544261 +0800
最近更改: 2022-03-17 14:05:49.624544261 +0800
最近改动: 2022-03-17 14:05:49.624544261 +0800
创建时间: -

touch -a filename #只修改文件的访问时间

$ touch -a test_one
$ stat test_one 
  文件: test_one
  大小: 0         	块: 0          IO 块: 4096   普通空文件
设备: 804h/2052d	Inode: 4468041     硬链接: 1
权限: (0664/-rw-rw-r--)  Uid: ( 1000/hollowman)   Gid: ( 1000/hollowman)
最近访问: 2022-03-17 14:10:04.416773006 +0800
最近更改: 2022-03-17 14:05:49.624544261 +0800
最近改动: 2022-03-17 14:10:04.416773006 +0800
创建时间: -

cp 复制文件

cp [选项] source destination

$ cp test_one test_two  #简单复制命令,但目标文件有新的修改时间
$ ls -l
总用量 0
-rw-rw-r-- 1 hollowman hollowman 0 3月  17 14:05 test_one
-rw-rw-r-- 1 hollowman hollowman 0 3月  17 14:15 test_two

如果目标文件已经存在,cp命令并不会提醒,加上-i选项后,则会强制询问是否需要覆盖已有文件。

$ cp -i test_one test_two
cp: 是否覆盖'test_two'? n

如果需要将非当前工作目录的文件复制到当前目录,可使用" . "

$ touch ../test_three  #尝试在当前目录的父目录创建一个文件
$ cp ../test_three .   #将父目录的文件复制到当前目录
$ ls -l
总用量 0
-rw-rw-r-- 1 hollowman hollowman 0 3月  17 14:05 test_one
-rw-rw-r-- 1 hollowman hollowman 0 3月  17 14:22 test_three
-rw-rw-r-- 1 hollowman hollowman 0 3月  17 14:15 test_two

注意复制文件到某个目录时,不要忘记"/",除非您能确保该目录存在。

$ cp test_one ../testdirs/  #因为testdirs不存在,所以会提示无法创建普通文件。
cp: 无法创建普通文件'../testdirs/': 不是目录
$ cp test_one ../testdirs #本意是复制到testdirs目录,而实际则是将复制后的文件重命名为testdirs。

复制目录及目录下面的所有文件,可以用-R属性

$ cp -R ../testdir/ .
$ ls -F
testdir/  test_one  test_three  test_two

ln 创建链接文件

链接文件有两种类型,符号链接 和 硬链接

符号链接 就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。使用 -s 选项可创建符号链接
硬链接 会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用ln命令时不再需要加入额外的参数了。

$ ln -s test_one ln_test_one_s   #创建符号链接
$ ln test_one ln_test_one        #创建硬链接
$ ls -il *one*                   #查看文件列表,对比3个文件
4468041 -rw-rw-r-- 2 hollowman hollowman 0 3月  17 14:05 ln_test_one
4457640 lrwxrwxrwx 1 hollowman hollowman 8 3月  18 09:26 ln_test_one_s -> test_one
4468041 -rw-rw-r-- 2 hollowman hollowman 0 3月  17 14:05 test_one

可以看出,符号链接文件属性与源文件属性并不相同,大小不同,inode编号也不同,类似于快捷方式,而硬链接文件和原始文件属性相同,并且同inode编号,属性中的2是硬链接数,表示该文件有2个硬链接文件,修改任意一个硬链接文件其他文件都会改变,删除1个硬链接对应的硬链接数将减1

注意: 只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。

mv 重命名/移动文件

mv命令可以将文件或目录移动到另一个位置或重新命名,而且,并不会改变文件的inode编号和时间戳。
当目标文件已存在时,会进行覆盖操作,通过-i选项可以在试图覆盖已有文件是得到提示

$ mv -i test_two test_three
mv: 是否覆盖'test_three'? n
$ mv test_two test_three 

rm 删除文件

**常用选项: **

rm -i filename  #删除前确认,养成使用-i的好习惯
rm -f filename  #强制删除,慎用
rm -r dirname   #删除目录及目录内的文件
rm -rf /        #强制删除根目录及目录文件,除非搞破坏不要使用此命令。
$ ls -F
ln_test_one_ss  testdir/  test_three
$ rm -i ln_test_one_ss   #确认后再删除文件
rm: 是否删除普通空文件 'ln_test_one_ss'? y
$ rm -r testdir/         #删除目录
$ ls -F
ln_test_one_ss  test_three

mkdir 创建目录

-p选项可以同事创建多层目录

$ mkdir a/b/c
mkdir: 无法创建目录 “a/b/c”: 没有那个文件或目录
$ mkdir -p a/b/c
$ cd a/b/c
/a/b/c$ 

rmdir 删除目录

rmdir命令只能删除空目录, rm -i 也可以用来删除目录,并且是非空目录,因此一般不用rmdir命令。

tr 替换文本内容

tr,translate的意思,可以替换文本内容中的字符,需通过管道符来实现

语法: tr [原始字符] [目标字符]

tar 对文件进行压缩、解压缩

语法: tar [选项...] [FILE]...

选项

-c 	创建压缩文件
-x 	解开压缩文件
-t 	查看压缩包内有哪些文件
-z 	用Gzip压缩或解压
-j 	用bzip2压缩或解压
-v 	显示压缩或解压的过程
-f 	目标文件名
-p 	保留原始的权限与属性
-P 	使用绝对路径来压缩
-C 	指定解压到的目录

实例

  tar -cvf archive.tar foo bar  # 将foo和bar压缩为archive.tar包
  tar -xvf archive.tar          # 将archive.tar解压缩
  tar -tvf archive.tar         # 查看archive.tar包文件列表

dd 复制文件,依照指定操作数转换并格式化。

语法: dd [操作数] ... 或: dd 选项(仅用于显示帮助信息–help和版本信息–version)

常用操作数

  if=文件         从指定文件而非标准输入来进行读取
  of=文件         写入到指定文件而非标准输出
  bs=字节数       一次读写的比特数(默认: 512);会覆盖 ibs 和 obs 选项
  ibs=字节数      一次读取的字节数(默认: 512),与obs配合使用
  obs=字节数      一次写入指定字节数(默认: 512),与ibs配合使用
  cbs=字节数      一次转换的字节数
  count=块数      指定需要复制的输入块的数量

**块数和字节数后可以带有以下的一个或多个后缀: **
c=1, w=2, b=512, kB=1000, K=1024, MB=10001000, M=10241024, xM=M,GB=100010001000, G=102410241024 以及相应可使用 T, P, E, Z, Y。也可使用二进制进位前缀: 如 KiB=K、MiB=M 等等。

以下3个复制操作数虽不同,但效果相同:

# dd if=/dev/zero of=h1 count=1 bs=1024
记录了1+0 的读入
记录了1+0 的写出
1024字节(1.0 kB,1.0 KiB)已复制,0.000397286 s,2.6 MB/s

# dd if=/dev/zero of=h1 count=1 obs=1024 ibs=1024
记录了1+0 的读入
记录了1+0 的写出
1024字节(1.0 kB,1.0 KiB)已复制,0.00090209 s,1.1 MB/s

# dd if=/dev/zero of=h1 count=2
记录了2+0 的读入
记录了2+0 的写出
1024字节(1.0 kB,1.0 KiB)已复制,0.000301429 s,3.4 MB/s

/dev/zero:“零”设备,本身不占存储空间,但可以无限的提供空字符(0x00,ASCII代码NUL)。常用来配合dd命令生成一个特定大小的文件。

三、文件权限管理

chown 修改文件的属主(所有者)和属组(所属组)

语法: chown owner:group 文件名

$ ls -l
总用量 12
drwxrwxr-x 3 hollowman hollowman 4096 3月  18 11:07 a
-rw-rw-r-- 1 hollowman hollowman   22 3月  18 13:22 a.sh
-rw-rw-r-- 1 hollowman hollowman    7 3月  18 13:33 test_three
$ sudo chown root:root a.sh          #注意: 如果涉及到root用户,需要通过sudo获取root权限
[sudo] hollowman 的密码:  
$ ls -l
总用量 12
drwxrwxr-x 3 hollowman hollowman 4096 3月  18 11:07 a
-rw-rw-r-- 1 root      root        22 3月  18 13:22 a.sh
-rw-rw-r-- 1 hollowman hollowman    7 3月  18 13:33 test_three

chmod 修改文件/目录权限

$ ll file1   #无权限文件file1
---------- 1 hollowman hollowman 0 9月  18 11:18 file1

$ chmod u+r,g+w file1 #u,g分别赋权r和w
$ ll file1
-r---w---- 1 hollowman hollowman 0 9月  18 11:18 file1

$ chmod +x file1  #u,g,o都赋权x
$ ll file1
-r-x-wx--x 1 hollowman hollowman 0 9月  18 11:18 file1*

$ chmod ugo+rwx file1  #u,g,o都赋权rwx
$ ll file1
-rwxrwxrwx 1 hollowman hollowman 0 9月  18 11:18 file1*

$ chmod 765 file1   #数字赋权法
$ ll file1
-rwxrw-r-x 1 hollowman hollowman 0 9月  18 11:18 file1*

SUID,SGID,SBIT赋权
SUID: 让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
SGID: 当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
SBIT(Sticky Bit)粘滞位: 当对目录设置SBIT权限后,目录中的文件只能被文件所有者删除,也就是用户只能删除自己的文件,而不能删除其他用户的文件。

$ chmod ug+s,o+t file1 
$ ll file1
-rwsrwsrwt 1 hollowman hollowman 0 9月  18 11:18 file1*
$ chmod 4000 file1 
$ ll file1
---S------ 1 hollowman hollowman 0 9月  18 11:18 file1
$ chmod 6000 file1 
$ ll file1
---S--S--- 1 hollowman hollowman 0 9月  18 11:18 file1
$ chmod 7000 file1 
$ ll file1
---S--S--T 1 hollowman hollowman 0 9月  18 11:18 file1
$ chmod 7777 file1 
$ ll file1
-rwsrwsrwt 1 hollowman hollowman 0 9月  18 11:18 file1*

chattr 设置文件隐藏权限(change attributes)

语法: chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...

**属性: **

s:  第1位隐藏属性,彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
u:  第2位隐藏属性,与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion
S:  第3位隐藏属性,文件内容在变更后立即同步到硬盘(sync)
i:  第5位隐藏属性,设定文件不能被修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件。
a:  第6位隐藏属性,append Only,仅允许补充(追加)内容,无法覆盖/删除内容。
d:  第7位隐藏属性,no dump,使用dump命令备份时忽略(也就是不备份)本文件/目录
A:  第8位隐藏属性,文件或目录的 atime (access time)不可被修改(modified)
c:  第9位隐藏属性,compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
j:  第11位隐藏属性,journal,设定此参数使得当通过mount参数: data=ordered 或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
t:  第12位隐藏属性,让文件系统支持尾部合并(tail-merging)
D:  检查压缩文件中的错误(不能通过lsattr查看,直接通过+D进行检查)

lsattr 查看文件隐藏属性

# chattr +s test_three  && lsattr ./test_three
s------------------- ./test_three
# chattr -s test_three  && lsattr ./test_three
-------------------- ./test_three
# chattr =uiaAct test_three  && lsattr ./test_three
-u--ia-Ac---t------- ./test_three
# chattr -uiaAct test_three  && lsattr ./test_three
-------------------- ./test_three

setfacl 设置文件的ACL(访问控制列表)

语法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...

选项:

  -m, --modify=acl 更改文件的访问控制列表
  -M, --modify-file=file 从文件读取访问控制列表条目更改
  -x, --remove=acl 根据文件中访问控制列表移除条目
  -X, --remove-file=file 从文件读取访问控制列表条目并删除
  -b, --remove-all 删除所有扩展访问控制列表条目
  -k, --remove-default 移除默认访问控制列表
      --set=acl 设定替换当前的文件访问控制列表
      --set-file=file 从文件中读取访问控制列表条目设定
      --mask 重新计算有效权限掩码
  -n, --no-mask 不重新计算有效权限掩码
  -d, --default 应用到默认访问控制列表的操作
  -R, --recursive 递归操作子目录
  -L, --logical 依照系统逻辑,跟随符号链接
  -P, --physical 依照自然逻辑,不跟随符号链接
      --restore=file 恢复访问控制列表,和“getfacl -R”作用相反
      --test 测试模式,并不真正修改访问控制列表属性
  -v, --version           显示版本并退出
  -h, --help              显示本帮助信息

getfacl 查看文件的ACL(访问控制列表)

语法: getfacl [-aceEsRLPtpndvh] 文件 ...

选项:

  -a,  --access           仅显示文件访问控制列表
  -d, --default           仅显示默认的访问控制列表
  -c, --omit-header     不显示注释表头
  -e, --all-effective     显示所有的有效权限
  -E, --no-effective      显示无效权限
  -s, --skip-base         跳过只有基条目(base entries)的文件
  -R, --recursive         递归显示子目录
  -L, --logical           逻辑遍历(跟随符号链接)
  -P, --physical          物理遍历(不跟随符号链接)
  -t, --tabular           使用制表符分隔的输出格式
  -n, --numeric           显示数字的用户/组标识
  -p, --absolute-names    不去除路径前的 '/' 符号
  -v, --version           显示版本并退出
  -h, --help              显示本帮助信息
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值