linuxCommands2
…
file
file
命令用来某个文件的类型。
1 | $ file index.html |
file 工具可以对所给的文件一行简短的介绍,它用文件后缀、头部信息和一些其他的线索来判断文件。你在检查一堆你不熟悉的文件时使用 find 非常方便:
1 | $ find -exec file {} \; |
find
find
命令用于寻找文件,会包括当前目录的所有下级目录。
如果不带任何参数,find
文件会列出当前目录的所有文件,甚至还包括相对路径。如果把结果导入 sort 效果更好。
1 | $ find | sort |
如果想要 ls -l 样式的列表,只要在 find 后面加上 -ls。
1 | $ find -ls |
find 有它自己的一套复杂的过滤语句。下面列举的是一些最常用的你可以用以获取某些文件列表的过滤器:
- find -name ‘*.c’ —— 查找符合某 shell 式样式的文件名的文件。用 iname 开启大小写不敏感搜索。
- find -path ‘test‘ —— 查找符合某 shell 式样式的路径的文件。用 ipath 开启大小写不敏感搜索。
- find -mtime -5 —— 查找近五天内编辑过的文件。你也可以用 +5 来查找五天之前编辑过的文件。
- find -newer server.c —— 查找比 server.c 更新的文件。
- find -type d —— 查找所有文件夹。如果想找出所有文件,那就用 -type f;找符号连接就用 -type l。
要注意,上面提到的这些过滤器都是可以组合使用的,例如找出近两天内编辑过的 C 源码:
1 | $ find -name '*.c' -mtime -2 |
默认情况下, find 对搜索结果所采取的动作只是简单地通过标准输出输出一个列表,然而其实还有其他一些有用的后续动作。
- -ls —— 如前文,提供了一种类 ls -l 式的列表。
- -delete —— 删除符合查找条件的文件。
- -exec —— 对搜索结果里的每个文件都运行某个命令,
{}
会被替换成适当的文件名,并且命令用\;
终结。
1 | $ find -name '*.pl' -exec perl -c {} \; |
你也可以使用+
作为终止符来对所有结果运行一次命令。我还发现一个我经常使用的小技巧,就是用 find 生成一个文件列表,然后在 Vim 的垂直分窗中编辑:
1 | $ find -name '*.c' -exec vim {} + |
fmt
fmt
命令用于对文本指定样式。
下面是example.txt
的内容,是非常长的一行。
1 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. |
fmt
可以将其输出为每行80个字符。
1 | cat example.txt | fmt -w 20 |
grep
grep
命令用于文件内容的搜索,返回所有匹配的行。
1 | $ grep pattern filename |
下面是一个例子。
1 | $ grep admin /etc/passwd |
一般情况下,应该使用grep -R
,递归地找出当前目录下符合someVar
的文件。
1 | $ grep -FR 'someVar' . |
別忘了大小不敏感的参数,因为 grep 默认搜索是大小写敏感的。
1 | $ grep -iR 'somevar' . |
也可以用grep -l
光打印出符合条件的文件名而非文件内容选段。
1 | $ grep -lR 'somevar' . |
如果你写的脚本或批处理任务需要上面的输出内容,可以使用 while 和 read 来处理文件名中的空格和其他特殊字符:
1 | grep -lR someVar | while IFS= read -r file; do |
如果你在你的项目里使用了版本控制软件,它通常会在 .svn, .git, .hg 目录下包含一些元数据。你也可以很容易地用 grep -v 把这些目录移出搜索范围,当然得用 grep -F 指定一个恰当且确定的字符串,即要移除的目录名:
1 | $ grep -R 'someVar' . | grep -vF '.svn' |
部分版本的 grep 包含了 –exclude 和 –exclude-dir 选项,这看起来更加易读。
参数
-i
参数表示忽略大小写。
-r
表示搜索某个目录下面的所有文件。
1 | $ grep -r admin /etc/ |
-v
过滤包含某个词的行,即grep
的逆操作。
1 | # 显示所有包含 vim,但不包含 grep 的行 |
gunzip
gunzip
命令用于解压gzip
命令压缩的文件。
gzcat
gzcat
命令用于查看一个gz
文件,但并不实际解压它。
1 | $ gzcat filename |
gzip
gzip
命令用于压缩文件。
kill
kill
命令用户终止指定进程。
1 | $ kill PID |
killall
killall
命令终止给定名字的一系列相关进程。
1 | $ killall processname |
last
last
命令显示用户登录系统的记录。
1 | $ last |
last
命令后面加上用户名,会显示该用户上次登录的信息。
1 | $ last yourUsername |
lpq
lpq
命令显示打印机队列。
1 | $ lpq |
lpr
lpr
命令用于打印文件。
1 | lpr filename |
ls
ls
命令用于列出当前目录里面的文件和子目录。
参数
- a:列出隐藏文件
- l:以长格式列出文件
- t:按最后编辑日期排序,最新的最先。这在某个大目录里找出最近修改的文件列表时很有用,比如将结果导入( pipe ) head 或者 sed 10q。或许加上 -l 会效果更好。当然如果你想获取最旧的文件列表,只要加 -r 反转列表即可。
- X:按文件类型分类。这在多语言或多后缀的项目中特别方便,比如头文件和源文件分开,或区分开源文件和生成文件或目录。
- v:按照文件名里的版本号排序。
- S:按文件大小排序。
- R:递归地列举文件。这个选项和 -l 组合使用并将结果导出到 less 效果很好。
可以把结果导出给类似 vim 的进程。
1 | $ ls -XR | vim - |
nl
nl
命令用于显示行号。
下面是example.txt
文件的内容。
1 | Lorem ipsum |
nl
命令让上面这段文本显示行号。
1 | $ nl -s". " example.txt |
-s
参数表示行号的后缀。
ps
ps
命令列出当前正在执行的进程信息。
由于进程很多,所以为了快速找到某个进程,一般与grep
配合使用。
1 | # 找出正在运行 vim 的进程 |
参数
-u
参数列出指定用户拥有的进程。
1 | $ ps -u yourusername |
scp
基本用法
scp
是 secure copy 的缩写,用来在两台主机之间加密传送文件。它的底层是 SSH 协议,默认端口是22。
它主要用于以下三种复制操作。
- 从本地系统到远程系统。
- 从远程系统到本地系统。
- 在本地系统的两个远程系统之间。
使用scp
传输数据时,文件和密码都是加密的,不会泄漏敏感信息。
scp
的语法类似cp
的语法。
注意,如果传输的文件在本机和远程系统,有相同的名称和位置,scp
会在没有警告的情况下覆盖文件。
(1)本地文件复制到远程系统
复制本机文件到远程系统的基本语法如下。
1 | # 语法 |
下面是复制整个目录。
1 | # 将本机的 documents 目录拷贝到远程主机, |
(2)远程文件复制到本地
从远程主机复制文件到本地的语法如下。
1 | # 语法 |
下面是复制整个目录的例子。
1 | # 拷贝一个远程目录到本机目录下 |
(3)两个远程系统之间的复制
本机发出指令,从远程主机 A 拷贝到远程主机 B 的语法如下。
1 | # 语法 |
系统将提示您输入两个远程帐户的密码。数据将直接从一个远程主机传输到另一个远程主机。
参数
-P
用来指定远程主机的 SSH 端口。如果远程主机使用非默认端口22,可以在命令中指定。
1 | $ scp -P 2222 user@host:directory/SourceFile TargetFile |
-p
参数用来保留修改时间(modification time)、访问时间(access time)、文件状态(mode)等原始文件的信息。
1 | $ scp -C -p ~/test.txt root@192.168.1.3:/some/path/test.txt |
-l
参数用来限制传输数据的带宽速率,单位是 Kbit/sec。对于多人分享的带宽,这个参数可以留出一部分带宽供其他人使用。
1 | $ scp -l 80 yourusername@yourserver:/home/yourusername/* . |
上面代码中,scp
命令占用的带宽限制为每秒80K比特位,即每秒10K字节。
-c
参数用来指定加密算法。
1 | $ scp -c blowfish some_file your_username@remotehost.edu:~ |
上面代码指定加密算法为blowfish
。
-C
表示是否在传输时压缩文件。
1 | $ scp -c blowfish -C local_file your_username@remotehost.edu:~ |
-q
参数用来关闭显示拷贝的进度条。
1 | $ scp -q Label.pdf mrarianto@202.x.x.x:. |
-F
参数用来指定 ssh_config 文件。
1 | $ scp -F /home/pungki/proxy_ssh_config Label.pdf |
-v
参数用来显示详细的输出。
1 | $ scp -v ~/test.txt root@192.168.1.3:/root/help2356.txt |
-i
参数用来指定密钥。
1 | $ scp -vCq -i private_key.pem ~/test.txt root@192.168.1.3:/some/path/test.txt |
-r
参数表示是否以递归方式复制目录。