说明:本文内容来源于博主“骏马金龙”的《Linux基础千锤百炼》。 本文列出里面的骚操作,知识点,用于参考学习。
1.1.1 bash shell 通配符
可以使用
*
、
?
、
[]
等的通配符来扩展路径或文件名。例如,
ls *.log
将列出当前路
径下所有以
".log"
字符结尾的文件名
(
但不包括
"."
开头的隐藏文件
)
。
默认情况下,
bash
提供的通配符规则比较弱,例如
"*"
无法匹配文件名开头的
"."
,
无法匹配路径分隔符号
(
即斜线
"/")
,但可以通过
set
或
shopt
命令开启额外的通
配功能,实现更完善的通配符规则。
例如,默认情况下,想要匹配目录
/path
下所有隐藏文件和非隐藏文件,如下:
ls .* *
感觉比tree显示得好看。
开启
dotglob
功能,
"*"
就可以匹配以
"."
开头的文件:
shopt -s dotglob
ls *
1.6.1 cp 命令
选项说明:
-p
: 文件的属性
(
权限、属组、时间戳
)
也复制过去。如果不指定
p
选项,谁执行复制动作,文件所有者
和组就是谁。
-r
或
-R
:递归复制,常用于复制非空目录。
-d
:复制的源文件如果是链接文件,则复制链接文件而不是指向的文件本身。即保持链接属性,复制快
捷方式本身。如果不指定
-d
,则复制的是链接所指向的文件。
-a
:
a=pdr
三个选项。归档拷贝,常用于备份
。
一般使用
cp -a
即可,对于目录加上
-r
选项即可。
注意,
bash
内置命令在进行通配符匹配文件的时候,
*
、
?
、
[]
是无法匹配到以
"."
开头的文件的,所以
"*"
不会匹配隐藏文件。要通配隐藏文件,使用
"."
代替上述几
种通配元字符即可,它能匹配除了
"."
和
".."
这两个特殊目录外的所有文件。它并非
通配符,而是表示当前目录,显然直接复制目录,是可以将隐藏文件复制走的。
例如,复制
/etc/skel
目录下所有文件包括隐藏文件到
/tmp
目录下。
cp -a /etc/skel/. /tmp
如果有重复文件,则即使加上
-f
选项,也一样会交互式询问。解决方法可以是使用
"yes"
这个工具,它会不断的生成
y 字母直到进程被杀掉,当然也可以自行指定要生成的字符串。
yes | cp -a /etc/skel/. /tmp
这个yes指令是个亮点, yes重定向到文本不到2分钟,就能产生百亿行的y ,20多GB的容量的文本
1.6.3 mv 命令
mv
命令移动文件和目录,还可以用于重命名文件或目录。
-b
:类似于
--backup
,但不接受参数
,
默认备份文件是在文件名后加上波浪线,如
/b.txt~
-f
:如果目标文件已存在,则强制覆盖文件
mv
默认已经是递归移动
,
不需要
-r
参数。
1.6.4 mv 的一个经典问题(mv 的本质)
该问题涉及文件系统操作文件的机制,若不理解,请先深入学习文件系统。
mv
不能实现里层同名目录覆盖外层同名目录。如
/tmp
下有
a
目录,
a
目录里还有 a 目录。
![](https://i-blog.csdnimg.cn/blog_migrate/f232208c7827555b7930211ad202437f.png)
(关系到inode table ,data block ,inode指针的东西, 看不太懂。 但知道这个问题,还是有点开眼界的)
1.8.3 whatis
(这个面试题好像有过)列出给定命令
(
并非一定是命令
)
的
man
文档信息。
whatis passwd
sslpasswd (1ssl) - compute password hashes
passwd (1) - update user's authentication tokens
passwd (5) - password file
根据上面的结果,执行:
man 1 passwd # 获取 passwd 命令的 man 文档
man 5 passwd # 获取 password 文件的 man 文档,文件类的 man 文档说明的是该文件中各配置项意义
man sslpasswd # 获取 sslpasswd 命令的 man 文档,实际上是 openssl passwd 的 man 文档
1.9 find
(1).
最基础的打印操作
[root@xuexi tmp]# find /tmp/a # 等价于 find /tmp/a -print,表示搜索/tmp/a 目录
(2).
文件名搜索:
-name
或
-path
[root@xuexi tmp]# find /tmp -name "*.log"
(3).
根据文件类型搜索:
-type
一般需要搜索的文件类型就只有普通文件
(f)
,目录
(d)
,链接文件
(l)
。
[root@xuexi test]# find /tmp -type f -name "a*.sh"
搜索目录类文件,且目录名以 a 开头。
[root@xuexi test]# find /tmp -type d -name "a*"
(4).
根据文件的时间戳搜索:
-atime/-mtime/-ctime
例如搜索
/tmp
下
3
天内修改过内容的
sh 文件,因为是文件内容,所以不考虑搜索 目录。
find /tmp -type f -mtime -3 -name "*.sh"
(5).
根据文件大小搜索:
-size
例如搜索
/tmp
下大于
100K
的
sh
文件。
find /tmp -type f -size +100k -name '*.sh'
(6).
根据权限搜索:
-perm
例如搜索
/tmp
下所有者具有可读可写可执行权限的
sh
文件。
find /tmp -type f -perm -0700 -name '*.sh'
(7).
搜索空文件
空文件可以是没有任何内容的普通文件,也可以是没有任何内容的目录。
例如搜索目录中没有文件的空目录。
find /tmp -type d -empty
(8).
搜索到文件后并删除
例如搜索到
/tmp
下的
".tmp"
文件然后删除。
find /tmp -type f -name "*.tmp" -exec rm -rf '{}' \;
linux 在查找删除后,echo显示删了哪些东西
find /root/del -type -f -exec bash -c "echo {}; rm -f {}" \;
(9).
搜索指定日期范围的文件,例如搜索
/test
下
2017-06-03
到
2017-06-06
之
间修改过的文件
find /test -type f -newermt 2017-06-03 -a ! -newermt 2017-06-06
(10). 并行加速搜索
为了加速搜索,使用
xargs 的并行功能。例如, 搜索
"/"
下的所有
"Find.pm"
结尾的文件: (涨知识)
ls --hide proc / | xargs -i -P 0 find /{} -type f -name "*Find.pm"
可以使用
time
命令看看
cpu
利用率:
/usr/bin/time bash -c 'ls --hide proc / | xargs -i -P 0 find /{} -type f -name
"*Find.pm" | sort'
/perlapp/perl-5.26.2/cpan/Pod-Parser/lib/Pod/Find.pm
/perlapp/perl-5.26.2/ext/File-Find/lib/File/Find.pm
/usr/share/perl5/vendor_perl/Pod/Find.pm
/usr/share/perl5/File/Find.pm
0.04user 0.25system 0:00.19elapsed 149%CPU (0avgtext+0avgdata 5492maxresident)k
0inputs+0outputs (0major+12685minor)pagefaults 0swaps
(11). 获取搜索到文件的绝对路径
#
使用
bash
的波浪号扩展
~+ (列出当前目录下的所有文件夹/文件)
find ~+
(12).
获取搜索到文件的文件名部分
(basename)
mkdir /tmp/test/test1
touch /tmp/test/test1/{x,y,z}.png
find /tmp/test -printf "%f\n"
======等价求basename
find ~+ -printf "%f\n" 和 find ~+ -exec basename {} \;
显示的结果是一样的
(13).
从结果中排除目录自身
find 搜索目录时,总是会将搜索路径自身也包含到搜索结果中。想办法排除它是必 须的。
排除的方法是,加上一个
-path
选项并取反,
-path
的参数和
find 的搜索路径参数 必须一致。
find /tmp/test ! -path /tmp/test
和
find . ! -path .
END