录制并回放终端会话
script
开始录制终端会话:
$ script -t 2> timing.log -a output.session
完整的录制过程如下:
$ script -t 2> timing.log -a output.session
find
要列出给定目录下所有的文件和子目录,可以采用下面的语法:
$ find base_path
bash_path可以是任意位置(例如/home/slynux),find会从该位置开始向下查找。. 指定当前目录,… 指定父目录。这是Unix文件系统中的约定用法。 例如:
$ find . -print
-name选项指定了待查找文件名的模式。这个模式可以是通配符,也可以是正则表达式。下面的例子中,’*.txt’能够匹配所有名字以.txt结尾的文件或目录。
$ find /home/slynux -name '*.txt' -print
find命令有一个选项-iname(忽略字母大小写),该选项的作用和-name类似,只不过在匹配名字时会忽略大小写。例如:
$ ls
example.txt EXAMPLE.txt file.txt
$ find . -iname "example*" -print ./example.txt
./EXAMPLE.txt
find命令支持逻辑操作符。-a和-and选项可以执行逻辑与(AND)操作,-o和-or选项可以执行逻辑或(OR)操作。
$ ls
new.txt some.jpg text.pdf stuff.png
$ find . \( -name '*.txt' -o -name '*.pdf' \) -print ./text.pdf
./new.txt
下面的命令演示了如何使用-and操作符选择名字以s开头且其中包含e的文件:
$ find . \( -name '*e*' -and -name 's*' \)
./some.jpg
下面的命令可以匹配.py或.sh文件:
$ ls
new.PY next.jpg test.py script.sh
$ find . -regex '.*\.(py\|sh\)$' ./test.py
script.sh
-iregex选项可以让正则表达式在匹配时忽略大小写。例如:
$ find . -iregex '.*\(\.py\|\.sh\)$'
./test.py
./new.PY
./script.sh
find也可以用!排除匹配到的模式:
$ find . ! -name "*.txt" -print
上面的find命令能够匹配所有不以.txt结尾的文件。该命令的运行结果如下:
$ ls
list.txt new.PY new.txt next.jpg test.py
$ find . ! -name "*.txt" -print .
./next.jpg
./test.py
./new.PY
下面的例子展示了如何列出运行在含有文件bundlemaker.def的目录下的所有任务:
$ find -L /proc -maxdepth 1 -name 'bundlemaker.def' 2>/dev/null
-L选项告诉find命令跟随符号链接
从/proc目录开始查找
-maxdepth 1将搜索范围仅限制在当前目录
-name 'bundlemaker.def’指定待查找的文件
2>/dev/null将有关循环链接的错误信息发送到空设备中
-mindepth选项类似于-maxdepth,不过它设置的是find开始进行查找的最小目录深度。 这个选项可以用来查找并打印那些距离起始路径至少有一定深度的文件。例如,打印出深度距离 当前目录至少两个子目录的所有名字以f开头的文件:即使当前目录或dir1和dir3中包含以f开头的文件,它们也不会被打印出来。
$ find . -mindepth 2 -name "f*" -print
./dir1/dir2/file1
./dir3/dir4/f2
find命令可以使用-type选项对文件搜索进行过滤。借助这个选项,我们可以告诉find命
令只匹配指定类型的文件。
只列出所有的目录(包括子目录):
$ find . -type d -print
将文件和目录分别列出可不是件容易事。不过有了find就好办了。例如,只列出普通文件:
$ find . -type f -print
只列出符号链接:
$ find . -type l -print
Unix/Linux文件系统中的每一个文件都有3种时间戳,如下所示。
访问时间(-atime):用户最近一次访问文件的时间。
修改时间(-mtime):文件内容最后一次被修改的时间。
变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。
打印出在最近7天内被访问过的所有文件。
$ find . -type f -atime -7 -print
打印出恰好在7天前被访问过的所有文件。
$ find . -type f -atime 7 -print
打印出访问时间超过7天的所有文件。
$ find . -type f -atime +7 -print
-mtime选项会根据修改时间展开搜索,-ctime会根据变化时间展开搜索。 -atime、-mtime以及-ctime都是以“天”为单位来计时的。find命令还支持以“分钟”
为计时单位的选项。这些选项包括:
-amin(访问时间);
-mmin(修改时间);
-cmin(变化时间)。
打印出7分钟之前访问的所有文件:
$ find . -type f -amin +7 -print
–newer选项可以指定一个用于比较修改时间的参考文件,然后找出比参考文件更新的(更 近的修改时间)所有文件。
例如,找出比file.txt修改时间更近的所有文件:
$ find . -type f -newer file.txt -print
find命令的时间戳处理选项有助于编写系统备份和维护脚本。
基于文件大小的搜索
可以根据文件的大小展开搜索:
大于2KB的文件
$ find . -type f -size +2k
小于2KB的文件
$ find . -type f -size -2k
大小等于2KB的文件
$ find . -type f -size 2k
除了k之外,还可以用其他文件大小单位。
b:块(512字节)。
c:字节。
w:字(2字节)。
k:千字节(1024字节)。
M:兆字节(1024K字节)。
G:吉字节(1024M字节)。
也可以根据文件权限进行文件匹配。列出具有特定权限的文件:
$ find . -type f -perm 644 -print
打印出权限为644的文件
perm选项指明find应该只匹配具有特定权限值的文件。
Web服务器上的PHP文件需要具有合适的执行权限。我们可以用
下面的方法找出那些没有设置好执行权限的PHP文件:
$ find . -type f -name "*.php" ! -perm 644 –print PHP/custom.php
$ ls -l PHP/custom.php
-rw-rw-rw-. root root 513 Mar 13 2016 PHP/custom.php
可以使用下面的命令打印出用户slynux拥有的所有文件:
$ find . -type f -user slynux -print
删除匹配的文件
find命令的-delete选项可以删除所匹配到的文件。下面的命令能够从当前目录中删 除.swp文件:
$ find . -type f -name "*.swp" -delete
你必须以root用户的身份执行find命令才能够更改文件或目录的所有权。
# find . -type f -user root -exec chown slynux {} \;
将给定目录中的所有C程序文件拼接起来写入单个文件all_c_files.txt。方法如下:
$ find . -type f -name '*.c' -exec cat {} \;>all_c_files.txt
$ find . -type f -name '*.c' -exec cat {} > all_c_files.txt \;
$ fine . -type f -name '*.c' -exec cat {} >all_c_files.txt +
下列命令可以将10天前的 .txt文件复制到OLD目录中:
$ find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
使用-prune选项排 除某些符合条件的文件:
$ find devel/source_path -name '.git' -prune -o -type f -print
-name “.git” –prune是命令中负责进行修剪的部分,它指明了.git目录应该被排除在外。 -type f –print描述了要执行的操作。