前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >100个Linux命令(1)-文件处理类

100个Linux命令(1)-文件处理类

原创
作者头像
懒人的小脑
修改2019-01-16 15:52:03
1.7K0
修改2019-01-16 15:52:03
举报

写在前面

这是一个系列文章,关于 Linux 中最基本的操作和原理,以命令的使用为线索,加以相应的原理解释。

100个Linux命令(1)-文件处理类

100个Linux命令(2)-用户管理

100个linux命令(3)-权限管理

100个Linux命令(4)-管理文件系统

100个Linux命令(5)-LVM

100个Linux命令(6)-软件管理 rpm 和 yum

100个Linux命令(7)-进程管理

100个 Linux 命令(8)-统计和查看系统状态

Linux 基础-RAID

本文主要包含文件(目录)的查看、创建和删除、以及查找命令的使用。

1.cd命令

cd命令用于切换路径。

路径分为绝对路径相对路径,绝对路径是由根 "/" 开始的路径,相对路径无需从根开始,并且可以使用路径展开符,如:

  • . :当前目录
  • .. :当前目录的父目录
    • :上一个工作目录
  • ~ :当前用户的家目录,cd命令的默认值

区分/dir/与/dir 一般情况下,/dir/与/dir都表示dir目录中的文件。 对于严格区分尾随斜线的情况时: 附带尾随斜线的表示此目录的所有文件; 不附加尾随斜线表示此目录本身和此目录的文件。

2.pwd命令

pwd命令用于显示当前的工作目录。

如果当前目录是链接目录,则显示链接目录的文件路径,使用-P选项显示定位到链接的原始目录。

pwd命令
pwd命令

3.basename & dirname 命令

basename命令用于获取路径的文件名,dirname用于获取路径的目录名。

这两个命令不检查路径是否存在,只要给出路径,即可获得文件名或者目录名。

4.ls命令

ls命令用于列出目录中的内容,默认以制表符分隔文件,默认以文件首字母排序。该命令等价于dir命令。

选项

  • l:长格式显示
  • R:递归显示
  • h:与-l一起,以易于阅读的格式输出文件大小,将字节换成k,将K换成M,将M换成G
  • p:对目录加上/标识符以作区分
  • a:不隐藏任何以"."开头的项目
  • A:列出除"."及".."以外的任何项目
  • d:显示目录本身的属性信息
  • i:显示文件innodeinnode
  • F:对不同类型的文件加上不同的标识符,如目录文件后的尾随斜线“/”
  • t:按修改时间排序
  • S:按文件大小排序,默认降序
  • r:反转排序
  • m:使用逗号分隔符显示文件
  • 1:以换行符分隔文件
  • l pattern:忽略被pattern匹配到的文件
  • --color:显示颜色

注意:ls以-h显示文件大小时,一般显示的都是不带B的单位,如K/M/G,它们的转换比例是1024,如果显示的都是带了B的,如KB/MB/GB,则它们的转换比例为1000而非1024,一般很少显示带B的大小。

ls -l显示的7列文件属性:文件类型和文件权限、硬链接数、属主、属组、文件大小、最近一次修改日期、文件(目录)名。

文件时间戳

文件时间属性有三种:atime、ctime、mtime

atime:access time,上一次的访问时间

mtime:modify time,文件(数据部分)修改时间

ctime:change time,文件(元数据(inode))修改时间

修改文件的data block部分时,文件的mtime会发生改变,文件元数据中mtime改变,进而文件的ctime也会改变。mtime改改变一定会引起ctime改改变;

修改文件的元数据,如重命名文件、修改文件所有者、移动文件(改变了文件的inode指针)等,文件的ctime会发生改变;

对于目录,目录中创建、删除以及目录内的任意文件操作,都会改变mtime;目录的mtime改变同样会引起ctime的改变,对目录本身元数据的修改也会改变ctime;

atime只有在文件被访问时才会改变,若不是打开文件编辑内容,则ctime和mtime的改变不会引起ctime的改变;

mtime的改变一定引起ctime的改变,而访问文件时(如cat),atime不一定改变。除非两次修改的atime的时间超过一天,或者修改了mtime,否则访问文件的inode不会引起atime改变。即当 cat 一个文件时,它的atime可能会改变,但是稍后再次cat,atime不会改变。(此机制由relatime维护)

bash shell 通配符

文件名通配匹配的整体的文件名,而非部分匹配

(1)*

匹配任意长度的任意字符。"*" 无法匹配文件名以 "." 开头的文件、无法匹配路径分隔符符号 "/"

代码语言:txt
复制
# 匹配目录中所有隐藏文件和非隐藏文件
ls .* * 

开启dotglob功能,"*"可以匹配以"."开头的文件

代码语言:txt
复制
shopt -s dotglob
ls * 

即递归到文件内部,又要匹配文件名,如递归找出多层目录/path下所有的".css"文件,这时可以开启globstar功能,使用"两星连珠"(**)就可以匹配匹配路径斜线。

代码语言:txt
复制
shopt -s globstar #开启星号模式匹配
ls /path/**/*.css 

非bash内置命令,可能会提供自己的通配符匹配,如find命令中name选项的星号(*)可以匹配以点开头的隐藏文件。

(2)?

匹配任意单个字符

(3)[]

匹配指定范围内的任意单个字符。

字母匹配:使用通配符[]时应该注意是基于字符顺序的,大小写字母的顺序是a-z --> A-Z,指定a-z表示小写字母a-z,同理A-Z,而a-zA-Z和a-Z都表示所有大小写字母。当然还可以指定a-A表示a-z外加一个A。

数字匹配:[]只能匹配单个字符,0-9表示0-9的数字,1-20表示1-2外加一个0,1-23表示1-2外加一个3,1-22-3表示1-2或2-3,迷惑点就是看上去是大于10的整数,其实是两个或者更多的单个数字组合体。也可以用这种方法表示多种匹配:1-2,2-3

5.tree命令

tree命令使用树状结构显示目录中的内容。

匹配选项

  • L:设置递归显示深度,指定的深度必须是大于0的整数
  • P:显示通配符匹配到的目录和文件,无论是否匹配,目录一定会显示
  • i:显示除被通配符匹配外的所有目录和文件

显示选项

  • a:显示隐藏文件
  • d:只显示目录
  • f:显示文件(目录)完整路径
  • i:不缩进显示,常与-f组合
  • p:显示权限位信息
  • h:显示大小
  • u:显示username或UID
  • g:先出groupid或GID
  • D:显示文件最后一次Mtime
  • --inodes:显示inode号
  • --device:显示文件(目录)所属的设备号
  • C:显示颜色

输出选项

  • o filename:指定将tree的结果输出到filename文件中
比较完整的tree输出
比较完整的tree输出

6.mkdir命令

mkdir命令用于创建目录。

一般用法:mkdirmkdir -mp 目录名

选项

  • m:创建目录时直接设置权限
  • p:递归创建多层目录,即上层目录不存在时也会直接将其创建出来(parent)
mkdir命令
mkdir命令

7.touch命令

touch命令主要用于修改文件的时间戳信息,当touch的文件不存时,会自动创建改文件。

一般用法:touch file_name

选项

  • c:强制不创建文件
  • a:修改文件access time
  • m:修改文件modification time
  • t:使用CCYYMMDDhhmm.ss格式的时间替代当前时间
  • d:使用字符串描述的时间格式替代当前时间,如“3 days ago”、“next Sunday”等

8.rm & rmdir命令

rm命令用于删除文件(目录),rmdir命令用于删除空目录

一般用法:rm rfi filename

选项

  • r:递归删除,删除目录时需要加此参数
  • i:交互式询问是否删除
  • f:强制删除,不进行询问

9.file命令

file命令用于查看文件类型属于二进制文件还是数据文件还是ASCII文件

选项

  • s:查看设备的文件系统类型(分区后格式化前)

10.cp & scp 命令

cpscp命令都是复制文件(目录的命令),scp用于远程复制。

一般用法:cp -a

代码语言:txt
复制
cp [-apdriulfs] src dest #复制单个文件(目录)
cp [-apdriuslf] src1 src2 src3 ... dest_dir #复制多个文件(目录)到一个目录

选项

  • p:文件的属性也跟随复制,如权限、属组、时间戳等。cp命令默认谁指定复制动作,复制后的文件所有者和组就是归属谁
  • r/R:递归复制,常用于复制非空目录
  • d:复制的源文件如果是链接文件,则复制链接文件而不是指向的文件本身。即保持链接属性,复制快捷方式本身。如果不指定-d则复制的是链接所指向的文件
  • a:a=pdr三个选项,归档拷贝,常用于备份
  • i:复制时如果 目标文件已经存在,询问是否替换
  • u:若目标文件和原文件同名,但属性不一样,则覆盖目标目标
  • f:强制复制
  • l:在目标位置建立硬链接
  • -s:在目标位置建立软链接

注意

bash内置命令在进行通配符匹配文件的时候,"*"、"?"、"[]"是无法匹配到以"."开头的文件的,所以"*"不会匹配隐藏文件。

要通配隐藏文件,使用"."代替上述几种通配元字符即可,它能匹配除了"."和".."这两个特殊目录外的所有文件。它并非通配符,而是表示当前目录,显然直接复制目录,是可以将隐藏文件复制走的。

例:复制/etc/skel目录下所有文件包括隐藏文件到/tmp目录下

代码语言:txt
复制
cp -a /etc/skel/. /tmp

如果有重复文件,则即使加上-f选项,也一样会交互式询问。解决方法可以是使用"yes"这个工具,它会不断的生成y字母直到进程被杀掉,当然也可以自行指定要生成的字符串。

代码语言:txt
复制
yes | cp -a /etc/skel/. /tmp

解析scp命令(待更新)

11.mv命令

mv命令用于移动或重命名文件(目录),默认递归移动。

一般用法:

代码语言:txt
复制
mv [-iuf] src dest # 移动单个文件(目录)
mv [-iuf] src1 src2 src3 dest_dir # 移动多个文件(目录)

选项

  • --backup=CONTROL:如果目标文件已存在,则对该文件做一个备份,默认备份文件是在文件名之后加上波浪线,如/b.txt~
  • b:类似于--backup,但不接受参数,默认备份文件是在文件名后加上波浪线
  • f:如果目标文件已存在,则强制覆盖
  • i:如果目标文件已存在,则提示是否覆盖,这是alias mv的默认选项
  • n:如果目标文件已存在,则不覆盖已存在的文件,如果同时指定了-f、-i、-n,后指定的选项生效
  • u:如果源文件和目标文件不同,则移动,否则不移动

移动和覆盖的本质(待更新)

12.cat & tac 命令

cat用于输出一个或多个文件的内容和将分行键入的内容输入到一个文件中去。

tac反向输出文件,将最后一行放在第一行的位置输出,此命令没有显示行号的参数 。

一般用法

代码语言:txt
复制
cat [OPTION]... [FILE]...

选项

  • n:先出所有行的行号
  • b:显示非空行的行号
  • E:在每行的行尾加上$符号
  • T:将TAB符号输出为"^|"
  • s:压缩连接的空行为单个行

功能演示:将键入的内容重定向至文件,而非标准输入中

cat命令重定向至文件
cat命令重定向至文件

13.head命令

head命令用于打印指定文件的前几行,默认显示文件前10行。

一般用法:head -n num -v filename

选项

  • n:显示前num行,如果num是负数,则显示除了最后|num|行的其余所有行,即显示前“总行数-|num”
  • v:显示文件名
head命令的用法
head命令的用法

14.tail命令

tail命令用于显示文件后面的行,默认显示10行。

一般用法:tail OPTION... FILE...

选项

  • n:输出最后num行,如果使用-n +num表示打印从第num行开始的所有行
  • f:监控文件变化
  • --pid=PID:和-f一起使用,在给定的PID的进程死亡之后,终止文件监控
  • v:显示文件名

15.nl命令

以行号的方式查看文件内容,默认空行不显示行号(等价于cat -b)

选项:-b a:无论是否是空行都显示行号,等价于cat -n

nl命令
nl命令

16.more & less

按页显示文件内容。

more:使用 "/" 搜索字符串,"n" 键向下搜索,"N" 键向上搜索

less:同上,还可以使用 "?" 搜索字符串,"n" 键向上搜索,"N"键向下搜索

17.diff & vimdiff

比较文件内容

一般用法:

代码语言:txt
复制
diff file1 file2
vimdiff file1 file2

18.which

显示命令或脚本的全路径,默认也会将命令的别名也显示出来

文件查找类-which命令
文件查找类-which命令

19.whereis

用于找出二进制文件、原文件和man文档文件

文件查找类-whereis命令
文件查找类-whereis命令

20.whatis

列出给定命令(并非一定是命令)的man文档信息

文件查找类-whatis命令
文件查找类-whatis命令

21.find命令

find命令用于搜索文件,下面是简要使用方法

(1)基础用法

搜索文件默认以"\n"将找到的文件分割。可以使用-print0使用"\0"分隔,将"\n"替换为"\0",实现不分行显示。

find用法-print0
find用法-print0

(2)文件名搜索

-name可以对文件的basename进行匹配,查找的文件名,最好使用引号包围,可以使用通配符。

find用法-name
find用法-name

-path用于在指定目录下搜索某目录中的某文件

find用法-path
find用法-path

(3)根据文件类型搜索

一般需要搜索的文件类型只有普通文件(f)、目录(d)、链接文件(l)

代码语言:txt
复制
find /tmp -type f -name "a*.sh"
find /tmp -type d -name "a*"

(4)根据文件的时间戳搜索

-atime、-mtime、-ctime

代码语言:txt
复制
find /tmp -type f -mtime -3 -name "*.sh"

(5)根据文件大小搜索

代码语言:txt
复制
find /tmp -type f -size +100k -name "*.sh"

(6)根据权限搜索

代码语言:txt
复制
find /tmp -type f -perm -0700 -name '*.sh'

(7)搜索空文件

代码语言:txt
复制
find /tmp -type d -empty

(8)搜索到文件后删除

代码语言:txt
复制
find /tmp -type f -name "*.tmp" -exec rm -rf '{}' \;

但是这是极不安全的方法,因为如果文件名有空白字符的话,会造成误删除,例如文件名为"a xy.tmp",则直接-exec rm -rf '{}'将会删除a和xy.tmp和"a xy.tmp",也就是说a这个文件或目录被误删除了。

(9)搜索指定日期范围的文件

代码语言:txt
复制
find /test -type f -newermt 2018-12-02 -a ! -newermt 2019-01-02

或者创建两个指定日期的临时文件,然后使用find -newer去参照这两个文件

代码语言:txt
复制
touch -m -d 2018-12-02 tmp1.txt
touch -m -d 2019-01-02 tmp2.txt
find /test -type f  -newer tmp1.txt -a ! -newer tmp2.txt

不过这样会把tmp2.txtx也搜索出来,因为newer搜索的是比xxx文件更新,取反则表示更旧或时间相同。

(10)加速并行搜索

有时候,想要搜索的内容并不知道在哪里,这时我们会从根"/"开始搜索,这样的搜索速度可能会稍微长那么一点点。为了加速搜索,使用xargs的并行功能。例如,搜索"/"下的所有"Find.pm"结尾的文件:

代码语言:txt
复制
ls --hide proc / | xargs -i -P 0 find /{ } -type f -name "*Find.pm"

参考链接

http://www.cnblogs.com/f-ck-need-u/p/6995195.html#auto_id_19

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档