这是一个系列文章,关于 Linux 中最基本的操作和原理,以命令的使用为线索,加以相应的原理解释。
本文主要包含文件(目录)的查看、创建和删除、以及查找命令的使用。
1.cd命令
cd
命令用于切换路径。
路径分为绝对路径和相对路径,绝对路径是由根 "/" 开始的路径,相对路径无需从根开始,并且可以使用路径展开符,如:
区分/dir/与/dir 一般情况下,/dir/与/dir都表示dir目录中的文件。 对于严格区分尾随斜线的情况时: 附带尾随斜线的表示此目录中的所有文件; 不附加尾随斜线表示此目录本身和此目录中的文件。
2.pwd命令
pwd
命令用于显示当前的工作目录。
如果当前目录是链接目录,则显示链接目录的文件路径,使用-P
选项显示定位到链接的原始目录。
3.basename & dirname 命令
basename
命令用于获取路径的文件名,dirname
用于获取路径的目录名。
这两个命令不检查路径是否存在,只要给出路径,即可获得文件名或者目录名。
4.ls命令
ls
命令用于列出目录中的内容,默认以制表符分隔文件,默认以文件首字母排序。该命令等价于dir
命令。
选项
注意: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)*
匹配任意长度的任意字符。"*" 无法匹配文件名以 "." 开头的文件、无法匹配路径分隔符符号 "/"
# 匹配目录中所有隐藏文件和非隐藏文件
ls .* *
开启dotglob功能,"*"可以匹配以"."开头的文件
shopt -s dotglob
ls *
即递归到文件内部,又要匹配文件名,如递归找出多层目录/path下所有的".css"文件,这时可以开启globstar功能,使用"两星连珠"(**)就可以匹配匹配路径斜线。
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
命令使用树状结构显示目录中的内容。
匹配选项
显示选项
-f
组合输出选项
6.mkdir命令
mkdir
命令用于创建目录。
一般用法:mkdirmkdir -mp 目录名
选项
7.touch命令
touch
命令主要用于修改文件的时间戳信息,当touch的文件不存时,会自动创建改文件。
一般用法:touch file_name
选项
8.rm & rmdir命令
rm
命令用于删除文件(目录),rmdir
命令用于删除空目录
一般用法:rm rfi filename
选项
9.file命令
file
命令用于查看文件类型属于二进制文件还是数据文件还是ASCII文件
选项
10.cp & scp 命令
cp
和scp
命令都是复制文件(目录的命令),scp
用于远程复制。
一般用法:cp -a
cp [-apdriulfs] src dest #复制单个文件(目录)
cp [-apdriuslf] src1 src2 src3 ... dest_dir #复制多个文件(目录)到一个目录
选项
cp
命令默认谁指定复制动作,复制后的文件所有者和组就是归属谁-d
则复制的是链接所指向的文件注意
bash内置命令在进行通配符匹配文件的时候,"*"、"?"、"[]"是无法匹配到以"."开头的文件的,所以"*"不会匹配隐藏文件。
要通配隐藏文件,使用"."代替上述几种通配元字符即可,它能匹配除了"."和".."这两个特殊目录外的所有文件。它并非通配符,而是表示当前目录,显然直接复制目录,是可以将隐藏文件复制走的。
例:复制/etc/skel目录下所有文件包括隐藏文件到/tmp目录下
cp -a /etc/skel/. /tmp
如果有重复文件,则即使加上-f
选项,也一样会交互式询问。解决方法可以是使用"yes"这个工具,它会不断的生成y字母直到进程被杀掉,当然也可以自行指定要生成的字符串。
yes | cp -a /etc/skel/. /tmp
解析scp
命令(待更新)
11.mv命令
mv
命令用于移动或重命名文件(目录),默认递归移动。
一般用法:
mv [-iuf] src dest # 移动单个文件(目录)
mv [-iuf] src1 src2 src3 dest_dir # 移动多个文件(目录)
选项
移动和覆盖的本质(待更新)
12.cat & tac 命令
cat
用于输出一个或多个文件的内容和将分行键入的内容输入到一个文件中去。
tac
反向输出文件,将最后一行放在第一行的位置输出,此命令没有显示行号的参数 。
一般用法
cat [OPTION]... [FILE]...
选项
功能演示:将键入的内容重定向至文件,而非标准输入中
13.head命令
head
命令用于打印指定文件的前几行,默认显示文件前10行。
一般用法:head -n num -v filename
选项
14.tail命令
tail
命令用于显示文件后面的行,默认显示10行。
一般用法:tail OPTION... FILE...
选项
15.nl命令
以行号的方式查看文件内容,默认空行不显示行号(等价于cat -b)
选项:-b a:无论是否是空行都显示行号,等价于cat -n
16.more & less
按页显示文件内容。
more:使用 "/" 搜索字符串,"n" 键向下搜索,"N" 键向上搜索
less:同上,还可以使用 "?" 搜索字符串,"n" 键向上搜索,"N"键向下搜索
17.diff & vimdiff
比较文件内容
一般用法:
diff file1 file2
vimdiff file1 file2
18.which
显示命令或脚本的全路径,默认也会将命令的别名也显示出来
19.whereis
用于找出二进制文件、原文件和man文档文件
20.whatis
列出给定命令(并非一定是命令)的man文档信息
21.find命令
find命令用于搜索文件,下面是简要使用方法
(1)基础用法
搜索文件默认以"\n"将找到的文件分割。可以使用-print0
使用"\0"分隔,将"\n"替换为"\0",实现不分行显示。
(2)文件名搜索
-name可以对文件的basename进行匹配,查找的文件名,最好使用引号包围,可以使用通配符。
-path用于在指定目录下搜索某目录中的某文件
(3)根据文件类型搜索
一般需要搜索的文件类型只有普通文件(f)、目录(d)、链接文件(l)
find /tmp -type f -name "a*.sh"
find /tmp -type d -name "a*"
(4)根据文件的时间戳搜索
-atime、-mtime、-ctime
find /tmp -type f -mtime -3 -name "*.sh"
(5)根据文件大小搜索
find /tmp -type f -size +100k -name "*.sh"
(6)根据权限搜索
find /tmp -type f -perm -0700 -name '*.sh'
(7)搜索空文件
find /tmp -type d -empty
(8)搜索到文件后删除
find /tmp -type f -name "*.tmp" -exec rm -rf '{}' \;
但是这是极不安全的方法,因为如果文件名有空白字符的话,会造成误删除,例如文件名为"a xy.tmp",则直接-exec rm -rf '{}'将会删除a和xy.tmp和"a xy.tmp",也就是说a这个文件或目录被误删除了。
(9)搜索指定日期范围的文件
find /test -type f -newermt 2018-12-02 -a ! -newermt 2019-01-02
或者创建两个指定日期的临时文件,然后使用find -newer
去参照这两个文件
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"结尾的文件:
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 删除。