第一个是 man 命令,作用是:"Display system documentation",我是 manual 的缩写。通过这个命令,我们能了解接下来要学习的命令的文档。

ls, pwd, cd 的基本用法我觉得不需要额外说明。

man

命令的主要说明文档。

如果要查询一个命令的一个参数,要怎么做?

比如查找 find -type

这其实属于 grep 命令的范畴了,命令是 man find | grep -e '-type'

cp

cp命令的复杂性源于文件系统的复杂性。常遇到的情况有:如何处理软链接文件?

如果目标文件存在,怎么办?如果目标文件存在,但是打不开,怎么处理?

source file 是一个文件夹的话,要复制多少,是复制整个文件夹,还是部分?

这些都能通过 cp 的参数来解决。

对于已存在的目标文件

-f 在权限范围内,强制删除然后新建并复制过去;

-i 提示用户,并等待用户选择

-n 不覆盖已存在文件,并且不会提示

软链接

-L    If the -R option is specified, all symbolic links are followed.

这个解释少了半截。搜索了一下,完整的意思是这样““Follows the links in the source to find the file to copy instead of copying the links ””

-P    If the -R option is specified, no symbolic links are followed.  This is the default.

默认情况下,只复制软链接而不复制它所对应的文件

源文件为文件夹

-R    If source_file designates a directory, cp copies the directory and

the entire subtree connected at that point.  If the source_file

ends in a /, the contents of the directory are copied rather than

the directory itself.  This option also causes symbolic links to be

copied, rather than indirected through, and for cp to create spe-

cial files rather than copying them as normal files.  Created

directories have the same mode as the corresponding source direc-

tory, unmodified by the process' umask.

In -R mode, cp will continue copying even if errors are detected.

Note that cp copies hard-linked files as separate files.  If you

need to preserve hard links, consider using tar(1), cpio(1), or

pax(1) instead.

这里有一个比较隐蔽的选项,如果源文件是文件夹,并且它的路径以 '/' 结尾,就复制该文件夹下的所有文件过去(不放在该文件夹中)而不是复制该文件夹过去。

我们做一下测试

mkdir source_dir target_dir
$ touch source_dir/file1 source_dir/file2
$ ls source_dir
file1 file2
$ ls target_dir
$ cp -R source_dir target_dir/
$ ls target_dir/
source_dir
$ cp -R source_dir/ target_dir/
$ ls target_dir/
file1 file2 source_dir

这些参数可以组合使用,组合使用后也有问题,如果参数的作用冲突了,你还要弄清冲突后的效果。这里我暂时不深入了。

rm

rm 与 cp 类似,也存在文件夹、软链接的问题。

不带参数的 rm 只能删除非目录类型的文件。

删除文件夹

-d          Attempt to remove directories as well as other types of files.

尝试了一下,发现不能移除非空文件夹

如果要移除非空文件夹,使用 -R

软链接

The rm utility removes symbolic links, not the files referenced by the links.

mkdir

创建文件夹。

默认情况下,如果要创建的文件夹的中间路径有不存在的,那么会报错;

如果有 -p 选项,那么会自动创建中间不存在的文件夹;

ln

man ln 的说明看的有点糊涂,于是找到了 ln (Unix) 上的解释

通过链接文件,不同的文件名可以指向同一个文件。

ln 可以创建两种类型的链接文件:

  1. 符号链接,也称软链接,这是指向另一个不同路径文件的一个符号路径。
  2. 硬链接,这是一个存储了链接建立时它所指向文件的实际数据的文件副本。

从以下命令示例可看出两种链接文件的区别:

$ echo '文件内容' > oringinal.file
$ ln oringinal.file hardlink.file
$ ln -s oringinal.file softlink.file
$ cat softlink.file
文件内容
$ rm oringinal.file
$ cat softlink.file
cat: softlink.file: 没有那个文件或目录
$ cat hardlink.file
文件内容

原始文件被删除后,符号链接将失效,访问软链接时,会提示找不到文件,但硬链接文件还在,而且还保存有原始文件的内容。

硬链接与 cp 有什么不一样?  

要理解这个,先要理解 inodes。这里 http://teaching.idallen.com/cst8207/12f/notes/460_links_and_inodes.html 讲的很详细。看完就就会理解下面的结论。

Thus, on Unix, a file can have many names, even across different directories. You may use any of the several names of a file to find the inode for the file. Unix calls these names "pointers" or "links" to the file.

Note that the "rm" command does not delete a file - it only deletes a name-inode map for a file. Only when all the name-inode maps are gone does the actual file data space get reclaimed.

读完上面那篇文章,我们能够知道,如果更改硬链接的文件,那么原始文件、软链接的文件都会变化,因为它们都指向相同的 inodes。但是复制出的文件就不会变化,因为是不同的 inodes 了。代码如下:

$ echo 'file content' > original.file
$ ln original.file hardlink.file
$ ln -s original.file softlink.file
$ cp original.file copied_original.file
$ rm original.file
$ ln hardlink.file original.file
# 更改文件
$ vim original.file
# 更改后的文件内容
$ cat original.file
file content
updated!!!
$ cat hardlink.file
file content
updated!!!
$ cat softlink.file
file content
updated!!!
# 使用 cp 复制出来的没有变化
$ cat copied_original.file
file content

  

mv

移动文件(夹)。可以看成是 cp 与 rm 的结合

rm -f destination_path && \
cp -pRP source_file destination && \
rm -rf source_file
cp -pRP

从源文件复制过去,保留各种属性信息,复制软链接而不是它的源文件,如果是文件夹,复制整个文件夹过去。

touch

改变文件的访问和修改时间。如果文件不存在,那么创建这个文件,文件权限为默认权限。

cat

cat -- concatenate and print files

The command:

cat file1 file2 > file3

will sequentially print the contents of file1 and file2 to the file file3, truncating file3 if it already exists.  See the manual page for your shell (i.e., sh(1)) for more

information on redirection.

The command:

cat file1 - file2 - file3

will print the contents of file1, print data it receives from the standard input until it receives an EOF (`^D') character, print the contents of file2, read and output contents

of the standard input again, then finally output the contents of file3.  Note that if the standard input referred to a file, the second dash on the command-line would have no

effect, since the entire contents of the file would have already been read and printed by cat when it encountered the first `-' operand.

cat file1 file2 > file3 会将 file1, file2 的内容联合起来,写入到 file3。file3 的内容会丢失。

cat file1 - file2 - file3 会打印输入的,直到 EOF 为止。不知道这个的作用是什么。

kill/pkill/killall

向对应进程发送信号

kill 根据 pid 找到进程,默认情况下发送 -SIGTERM 信号;

pkill 与 killall 根据一定条件找到进程,然后给这些进程发送信号;

pkill 与 killall

来源:https://unix.stackexchange.com/questions/91527/whats-the-difference-between-pkill-and-killall

The pgrep and pkill utilities were introduced in Sun's Solaris 7 and, as g33klord noted, they take a pattern as argument which is matched against the names of running processes. While pgrep merely prints a list of matching processes, pkill will send the specified signal (or SIGTERM by default) to the processes. The common options and semantics between pgrep and pkill comes in handy when you want to be careful and first review the list matching processes with pgrep, then proceed to kill them with pkillpgrep and pkill are provided by the the procps package, which also provides other /proc file system utilities, such as pstopfreeuptime among others.

The killall command is provided by the psmisc package, and differs from pkill in that, by default, it matches the argument name exactly (up to the first 15 characters) when determining the processes signals will be sent to. The -e--exact option can be specified to also require exact matches for names longer than 15 characters. This makes killall somewhat safer to use compared to pkill. If the specified argument contains slash (/) characters, the argument is interpreted as a file name and processes running that particular file will be selected as signal recipients. killall also supports regular expression matching of process names, via the -r--regexp option.

There are other differences as well. The killall command for instance has options for matching processes by age (-o--older-than and -y--younger-than), while pkill can be told to only kill processes on a specific terminal (via the -t option). Clearly then, the two commands have specific niches.

Note that the killall command on systems descendant from Unix System V (notably Sun's SolarisIBM's AIX and HP's HP-UX) kills all processes killable by a particular user, effectively shutting down the system if run by root.

The Linux psmisc utilities have been ported to BSD (and in extension Mac OS X), hence killallthere follows the "kill processes by name" semantics.

从上文可以看出,pkill 与 pgrep 是一对,你可以预先运行 pgrep 看到 pkill 要找的进程。

killall 默认情况下,匹配进程名的前15个字符,也可以调整选项进行完全匹配。killall 还可以通过创建时间来筛选,但我在 man killall 中没有找到;

可发送的信号

Signal Name Signal Number Description
SIGHUP 1 Hang up detected on controlling terminal or death of controlling process
SIGINT 2 Issued if the user sends an interrupt signal (Ctrl + C)
SIGQUIT 3 Issued if the user sends a quit signal (Ctrl + D)
SIGFPE 8 Issued if an illegal mathematical operation is attempted
SIGKILL 9 If a process gets this signal it must quit immediately and will not perform any clean-up operations
SIGALRM 14 Alarm clock signal (used for timers)
SIGTERM 15 Software termination signal (sent by kill by default)

来源:https://www.tutorialspoint.com/unix/unix-signals-traps.htm

SIGKILL 与 SIGTERM 的区别

SIGTERM is the termination signal. The default behavior is to terminate the process, but it also can be caught or ignored. The intention is to kill the process, gracefully or not, but to first allow it a chance to cleanup.

SIGKILL is the kill signal. The only behavior is to kill the process, immediately. As the process cannot catch the signal, it cannot cleanup, and thus this is a signal of last resort.

来源:https://www.quora.com/What-is-the-difference-between-the-SIGINT-and-SIGTERM-signals-in-Linux

top

显示系统进程的排序好的信息。可以从各个角度、参数来查看进程的信息,所以参数很多。

有四种不同的模式

-c <mode>

Set event counting mode to <mode>.  The supported modes are:

a      Accumulative mode.  Count events cumulatively, starting at the launch of top.  Calculate  CPU  usage  and  CPU  time

since the launch of top.

d      Delta  mode.   Count  events  relative to the previous sample.  Calculate CPU usage since the previous sample.  This

mode by default disables the memory object map reporting.  The memory object map reporting may  be  re-enabled  with

the -r option or the interactive r command.

e      Absolute mode.  Count events using absolute counters.

n      Non-event mode (default).  Calculate CPU usage since the previous sample.

Accumulative mode

Delta  mode

Absolute mode

Non-event mode

可以以不同的关键字排序,详情见 man top 中的 -o 选项

fg/bg

看这篇文章 《Bg, Fg, &, Ctrl-Z – 5 Examples to Manage Unix Background Jobs》

运行过程中会在当前的 terminal 显示输出,比如

find: /System/Library/Caches/com.apple.coresymbolicationd: Permission denied  

杀死一个后台任务后,并不会消失,而是变为 Terminated 状态

$ kill %1
$ jobs
[1]+ Terminated: 15 find / -ctime -1 > /tmp/changed-file-list.txt

后台任务与前台任务的区别

在同一个 shell 中,你需要等待前台任务执行完才能执行下一条指令,而后台任务就不用这样;

如果后台任务需要输入,你还是要把它弄回前台,才能继续;

当退出 shell 后,后台任务一样会被杀死。

crontab

来源:Linux crontab command

crontab 的全称是 cron table,是由 cron 去执行 crontable 中的任务。

我使用 MACOS,发现要用 sudo crontab 才能创建成功。对应的 crontab 在 root 用户下。

find

来源:A collection of Unix/Linux ‘find’ command examples

find 命令可以根据搜索条件来搜索整个文件系统以获取对应的文件或文件夹。并且,find 命令还可以与其他命令结合使用,比如 grep, mv, rm 等等。

常用搜索条件

文件类型

通过 man find,然后找到 -type。

文件名

-name

文件其他属性

mtime 修改时间。但是在 man find 中没有写。

修改时间

grep

打印出符合 pattern 的行

pattern 中包含 '-

使用 -e 参数

$grep -e -type file1 file2
file1:file1 content with - '-type'

还可以使用 -R 递归搜索整个文件夹中的文件

学习 Unix 常用命令的更多相关文章

  1. 一张图学习vim常用命令

    一张图学习vim常用命令

  2. goland学习-go常用命令使用

    goland学习-go常用命令使用 1.跨平台编译:env GOOS=linux GOARCH=amd64 go build 2.获取go第三方包:go get -u github.com/go-sq ...

  3. UNIX常用命令

    以下只说明各常用指令的基本用法, 若需详细说明, 请用 man 去读详细的 manual. 1.关於档案/目录处理的命令 ls--列目录 这是最基本的档案指令. ls 的意义为 "list& ...

  4. Redis学习笔记--常用命令

    以下为本人学习Redis的备忘录,记录了大部分常用命令 1.客户端连接redis服务端: ===启动Redis服务端 redis-server /yourpath/redis.conf ===启动Re ...

  5. docker学习笔记(1)概述、原理学习、常用命令

    一.Docker概述 Docker是基于Go语言实现的云开源项目,诞生于2013年初,目前主流的Linux操作系统已支持Docker,如Redhat RHEL6.5/CentOS6.5.Ubuntu ...

  6. Linux_学习_01_常用命令大全

    一.文件目录 1.列出目录 ls -a #显示隐藏文件 -l #显示文件和目录的详细资料 -h -lrt tree #显示文件和目录由根目录开始的树形结构 lstree #显示文件和目录由根目录开始的 ...

  7. Git学习 --> 个人常用命令add,commit以及push

    Git命令行配置1 安装Github2 安装msysgit3 要配置用户名和油箱  git config --global user.name <用户名> 我的命令就是:git confi ...

  8. Hexo学习笔记--常用命令及部署步骤

    参考资料: Hexo搭建Github静态博客:http://www.cnblogs.com/zhcncn/p/4097881.htmlHexo:独立博客新玩法:http://www.aips.me/h ...

  9. SQL学习笔记---常用命令

    常用命令 变量 1.声明 declare @变量名 类型,… 2.赋值 1.同时赋值多个变量(可以结合查询) select @变量名=表达式1,表达式2 2.单个赋值(推荐) set @变量名=表达式 ...

随机推荐

  1. 《从零開始学Swift》学习笔记(Day 57)——Swift编码规范之凝视规范:文件凝视、文档凝视、代码凝视、使用地标凝视

    原创文章.欢迎转载.转载请注明:关东升的博客 前面说到Swift凝视的语法有两种:单行凝视(//)和多行凝视(/*...*/).这里来介绍一下他们的使用规范. 1.文件凝视 文件凝视就在每个文件开头加 ...

  2. python 爬取王者荣耀高清壁纸

    代码地址如下:http://www.demodashi.com/demo/13104.html 一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 ...

  3. IFrame和Ajax比較

    说到比較,可能我是须要把这连个东西都给大家介绍一下的,可是介于大家都已经有了非常多的理解.我就简单的说了. Ajax:             是指一种创建交互式网页应用的网页开发技术.主要是利用Xm ...

  4. Asp.Net WebApi服务端解决跨域方案

    1.特性方式 主要是继承ActionFilterAttribute,重写OnActionExecuted方法,在action执行后,给响应头加上一个键值对. using System.Web.Http ...

  5. 36氪Plus消息:贷款组合推荐工具“钱小二”已获数百万天使轮融资

    根据"钱小二"在创业者社区36氪plus上的更新信息,该团队已获得数百万天使轮融资,投资方及投资时间不明. "钱小二"是一个贷款搜索 + 贷款组合推荐平台,目标 ...

  6. python C PyObject

    #include"Python.h" //three ways : /* PyObject *MyFunction(PyObject *self, PyObject *args); ...

  7. linq基础,正则表达式,.net相关

    声明扩展方法的步骤:类必须是static,方法是static,第一个参数是被扩展的对象,前面标注this.使用扩展方法的时候必须保证扩展方法类已经在当前代码中using.  LINQ:将int数组中大 ...

  8. [转]MVC设计模式

    MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). MVC模式最 ...

  9. UVa10099_The Tourist Guide(最短路/floyd)(小白书图论专题)

    解题报告 题意: 有一个旅游团如今去出游玩,如今有n个城市,m条路.因为每一条路上面规定了最多可以通过的人数,如今想问这个旅游团人数已知的情况下最少须要运送几趟 思路: 求出发点到终点全部路其中最小值 ...

  10. bat脚本批处理打war打包

    @echo =========================================== @echo 描述:打包脚本 @echo 作者:霍建国 @echo 日期:2018-03-13 @ec ...