[Linux]常用命令、组合命令以及输入输出重定向
文章目录
- 0.切换目录
- 1.复制文件和目录`cp`
- 1.1.复制文件
- 1.2.复制目录
- 1.3.扩展参数
- 2.删除文件和目录`rm`
- 2.1.删除文件
- 2.2.删除目录
- 2.3.扩展参数
- 3.创建文件和目录`touch`、`mkdir`
- 3.1.创建文件
- 3.2.创建目录
- 3.3.创建目录和中间必要的子目录
- 4.移动和重命名文件`mv`
- 5.变更到其他用户`su`
- 5.1.一般用法
- 5.2. 扩展
- 6.查看命令`ls`
- 6.1.总览
- 6.2.显示权限、所有者等详细信息
- 7.组合命令
- 7.1. 连续运行多个命令
- 7.2. 只有前面的命令运行Ok,才能运行下一个命令
- 7.3. 只有前面的命令运行Fail,才能运行下一个命令
- 7.4. 将一个命令的输出插入到另一个命令
- 7.5.输入\输出流
- 7.6. 将一个命令的输出 用作 另一个命令的输入
- 7.7. 将命令的输出重定向到文件
- 7.8. 防止重定向时 覆盖文件
- 7.9. 将命令的输出追加到文件
- 7.10.将文件作为命令的输入
- 8.参考文献
0.切换目录
cd ~
:切换到Home
目录;cd -
:切换到以前的目录;pwd
:显示当前目录路径。
1.复制文件和目录cp
1.1.复制文件
命令cp
# 将/etc/下的文件source.cpp复制到/home/下,变成dest.cpp
cp /etc/source.cpp /home/dest.cpp
# 将/etc/下的文件source.cpp复制到/home/下
cp /etc/source.cpp /home/
1.2.复制目录
要加上一个参数-r
# 将/etc/下的目录dirSource复制到/home/下
# 此时/home/下多了一个dirSource目录(包括里面的子文件和子文件夹)
cp -r /etc/dirSource /home/
1.3.扩展参数
cp -v
:cp -i
:cp -a
:
2.删除文件和目录rm
命令rm
2.1.删除文件
# 删除/etc/下的source.cpp文件
rm /etc/source.cpp
2.2.删除目录
要加上一个参数-r
# 将/etc/下的目录dirSource复制到/home/下
# 可以将目录及该目录中的所有文件全部删除
rm -r /home/dirSource
删除非空目录,还有一种更为简单的方法:把-R
(或recursive
)和-f
(或--force
)选项结合起来使用。-r
选项告诉rm
命令进入到它发现的每个子目录中去删除文件,而-f
选项只是告诉rm
命令完成任务但不要因为些细节问题(比如文件夹非空)而烦扰用户。
2.3.扩展参数
rm -v
:rm -i
:
3.创建文件和目录touch
、mkdir
3.1.创建文件
方法很多,用touch
命令可以创建一个空的文件,如果touch
后面跟的是一个已经存在的文件,则会修改该文件的修改日期。
touch newFile1.cpp
或者直接用>
生成一个文本文件:
echo "the str you want to write." > newFile2.txt
3.2.创建目录
命令mkdir
# 在当前目录下创建了两个目录 dir1 和 dir2 mkdir dir1 dir2
3.3.创建目录和中间必要的子目录
如果在当前目录下创建一个新目录,然后在再这个新目录中创建一个新的子目录,然后再创建子目录的子目录,怎么高效率完成? 用mkdir
的一个参数-p
或者--parents
。
# 在当前目录下创建一个son_dir目录
# 如果没有grand_pa和father_dir目录会先创建这两个目录
mkdir -p grandpa_dir/father_dir/son_dir
使用-v
选项(或--verbose
)能告诉你mkdir
命令所执行的每一步操作,你就不需要再进行实际检查来确定mkdir
命令是否正确完成了任务。
root@HP-xw4600:/home# mkdir -pv grandpa_dir/father_dir/son_dir
mkdir: 已创建目录 'grandpa_dir'
mkdir: 已创建目录 'grandpa_dir/father_dir'
mkdir: 已创建目录 'grandpa_dir/father_dir/son_dir'
4.移动和重命名文件mv
和cp
命令基本一致。
警告 对于mv
命令,有个非常重要但又很容易被忽略的细节需要知道。如果你在移动一个指向目录的软链接,就需要特别注意输入的内容。假设在你的home
目录中有一个名为dogs
的软链接指向/home/scott/pictures/dogs
,而你想将这个链接移动到/home/scott/libby
子目录中。以下这个命令只移动软链接:
$ mv dogs ~/libby
而以下这条命令移动的是软链接所指向的目录:
$ mv dogs/ ~/libby
区别在什么地方呢?就是在软链接的末端加了一个简单的斜杠(“/”
)。
- 没有斜杠的话,移动的是软链接本身,而且只是这个链接;
- 有了斜杠的话,移动的将是软链接指定的目录,而不是软链接本身。
一定要小心啊!
5.变更到其他用户su
5.1.一般用法
su
命令代表“switch user”
(切换用户),并不是大多数人想象的“super user”
(超级用户),能够让某个用户暂时以另一个用户的身份进行操作。当在shell
中想快速成为root
用户时,这个命令最常用,运行一两个命令,然后恢复到普通的非root
用户。
调用su
命令并不难。只要输入su
,后面跟上你想要采用的用户身份
就可以了。
root@HP-xw4600:/home# whoami
root
root@HP-xw4600:/home# su qfx
qfx@HP-xw4600:/home$ whoami
qfx
qfx@HP-xw4600:/home$ cd ~
qfx@HP-xw4600:~$ pwd
qfx@HP-xw4600:~$ /home/qfx
qfx@HP-xw4600:~$ su root
密码:
root@HP-xw4600:~# whoami
root
root@HP-xw4600:~# pwd
/root
5.2. 扩展
su
: 只输入su
相当于输入了su root
,即拥有了root
的名义和能力,而且只有这些了。实际上,非root
环境变量仍然存在;su -l username
:-l
或者--login
;su -
: 当使用su -
时,不但用户变更成了root
,而且还使用了root
的环境变量;
6.查看命令ls
6.1.总览
ls -R
: 用一个命令来查看多个子目录的内容;ls -r
: 以相反的顺序来排列显示内容,-r
或--reverse
;ls -X
:按文件的扩展名排序,-X
或--sort=extension
;ls -t
:按日期和时间排序,-t
或--sort=time
;ls -S
:按文件大小进行排序,-S
或--sort=size
;ls -h
: 用K、M和G显示文件大小;ls -1
: 用单独一列的方式来查看ls命令的结果;ls -l
: 显示权限、所有者等详细信息,使用-l
选项(或--format=long
);ls -a
: 查看隐藏文件和文件夹;ls -m
:另外一种显示格式选择就是-m
选项(或--format=commas
),用逗号分隔开;ls --color
:用不同颜色显示各种类型的文件和文件夹;ls -F
:ls
命令默认不会告诉你更多其他的信息。仅凭名称,很难区分清楚某项是文件、目录,或是其他什么东西。为了解决这一问题,可以让ls
命令提供更多的信息,一种简单方法就是使用-F
选项(或--classify
)。
ls -F
命令使用后,显示文件后面跟的字符的含义:
显示文件(文件夹)后面的字符 |
ls -F命令对应含义 |
---|---|
* |
可执行文件 |
/ |
目录 |
@ |
符号链接文件 |
| |
管道(FIFO) |
= |
嵌套字(socket) |
6.2.显示权限、所有者等详细信息
ls -l
: 显示权限、所有者等详细信息,使用-l
选项(或--format=long
);
drwxr-xr-x 2 qfx qfx 4096 11月 2 22:42 桌面
drwxrwxr-x 2 qfx qfx 4096 11月 2 21:32 HDD_sdb1
brw-rw---- 1 root disk 8, 5 11月 6 13:07 sda5
brw-rw---- 1 root disk 8, 16 11月 6 13:07 sdb
brw-rw---- 1 root disk 8, 17 11月 6 13:07 sdb1
crw-rw---- 1 root disk 21, 0 11月 6 13:07 sg0
crw-rw----+ 1 root cdrom 21, 1 11月 6 13:07 sg1
crw-rw---- 1 root disk 21, 2 11月 6 13:07 sg2
drwxrwxrwt 2 root root 140 11月 6 13:07 shm
crw------- 1 root root 10, 231 11月 6 13:07 snapshot
drwxr-xr-x 3 root root 200 11月 6 13:07 snd
brw-rw----+ 1 root cdrom 11, 0 11月 6 13:07 sr0
lrwxrwxrwx 1 root root 15 11月 6 13:07 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 11月 6 13:07 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 11月 6 13:07 stdout -> /proc/self/fd/1
crw-rw-rw- 1 root tty 5, 0 11月 6 13:07 tty
crw--w---- 1 root tty 4, 0 11月 6 13:07 tty0
crw--w---- 1 root tty 4, 1 11月 6 13:07 tty1
- 每行最右边1列,显示的是文件的名称;
- 向左一列,显示的文件最后被修改的时间(日期和时间);
- 再向左一列,显示文件的大小(单位是字节
B
,byte
); - 再向左一列,显示文件所属的
组
(以上的例子组有qfx
、root
、disk
、cdrom
等); - 再向左一列,显示文件的
所有者
(以上的例子所有者只有qfx
和root
); - 在向左一列,包含了一个数字。如果你正在处理一个文件,这个数字可以告诉你该文件有多少个硬链接(hard link);如果它是目录,这个数字是指该目录中包含有多少项内容。
- 最左边1列,包含每个文件和目录的真正权限。每个代码有10个字符,分成了4组:
将最左边1列分成4组,例如第二行的HDD_sdb1
,它的代码为drwxrwxr-x
分成4组,为d|rwx|rwx|r-x
- 第1组:由1个字符组成;
- 第2组:由3个字符组成,字符2~4;
- 第3组:由3个字符组成,字符5~7;
- 第4组:由3个字符组成,字符8~10;
第1组 告诉我们它是什么类型的文件,这个d
表示HDD_sdb1
是个目录,具体其他的类型如下表所示:
每行显示第1列字符 |
ls -l命令对应含义 |
---|---|
- |
普通文件 |
- |
可执行文件 |
d |
目录 |
l |
符号链接文件 |
s |
嵌套字(socket) |
b |
块设备(block device) |
c |
字符设备(character device) |
p |
命名管道(named pipe) |
第2组:文件所有者的权限; 第3组:文件的组的权限; 第4组:系统中其他用户的权限;
其中: r
: 表示允许读取
; w
: 表示允许改写
(可以修改和删除); x
: 表示允许执行
;
位置排列分别是rwx
,如果原本要出现r
、w
或x
的位置出现了-
,就表示不允许读写
、不允许改写
或不允许执行
。
7.组合命令
7.1. 连续运行多个命令
命令1 ; 命令2
如果需要连续运行多个命令,但是其中一些命令运行的时间比较长,而你不想长时间地守候在计算机旁,这个时候应该怎么办呢? 命令栈
(command stacking
)可以解决这一问题。 命令栈
是将所有需要运行的命令放到shell
的一行上,再用分号(;
)隔开每个具体的命令。接着依次顺序执行每个命令,只有一个命令结束运行(无论成功或失败),才会运行下一个命令。
root@HP-xw4600:~# sheep 3; import -frame pic.tif
这个例子中的sleep
命令会等待3秒钟,然后使用import
命令截取屏幕截图。有几秒钟的延迟,你就有时间最小化终端控制台应用程序,把你想让截图中出现的任何窗口调到前面来。分号(;
)便于从逻辑上分隔各个命令,这样你就能最大程度地使用这些命令。
7.2. 只有前面的命令运行Ok,才能运行下一个命令
命令1 && 命令2
依次顺序运行每个命令,但只有当前面一条命令运行成功之后,才能执行下一条命令[从技术上讲,每条命令返回的退出状态(exit status
)码必须为0
,才能运行下一条命令]。如果一条命令运行失败,整个命令链就会停下来。
root@HP-xw4600:~# unzip /home/qfx/mars.zip && rm /home/qfx/mars.zip
7.3. 只有前面的命令运行Fail,才能运行下一个命令
命令1 || 命令2
只有第一个命令失败了(从技术上讲,命令返回的退出状态码不为0
),第二条命令才会运行。可以把它看作这样的短语:不是运行第一个命令,就是运行第二个命令
。
当一个处理失败时,经常用||给管理员发送警告。例如,为了确保特定的计算机开启和正在运行,管理员可能不时地使用ping
命令对它进行查询。如果ping
不通,则发送一封电子邮件给管理员,通报这一情况。
root@HP-xw4600:~# ping -c 1 -w 15 -n 72.14.203.104 ||
{
echo “Server down” | mail -s 'Server down' admin@google.com
}
7.4. 将一个命令的输出插入到另一个命令
$()
命令替换(command substitution
)是接受一个命令的输出,并将它插入到另一个命令中,好像你直接手工输入这一输出的内容一样。用$()
将最初运行的命令括起来
(这个命令将产生要被插入的输出内容)。
用date "+%Y-%m-%d"
产生的字符串作为,mkdir
的参数,用于创建一个以年月日
为名字的文件夹。
root@HP-xw4600:~# ls
drwxr-xr-x 2 root root 4096 11月 2 22:39 ruleFTP/
root@HP-xw4600:~# date "+%Y-%m-%d"
2018-11-08
root@HP-xw4600:~# mkdir $(date "+%Y-%m-%d")
root@HP-xw4600:~# ls
drwxr-xr-x 2 root root 4096 11月 8 19:59 2018-11-08/
drwxr-xr-x 2 root root 4096 11月 2 22:39 ruleFTP/
7.5.输入\输出流
需要理解Linux shell
的三种输入/输出流
:
- 标准输入流(standard input)
- 标准输出流(standard output)
- 标准错误流(standard error)
每种输入/输出流
都有一个文件描述符(或数字标识符)
、一个常用的缩写名
和一个可用的默认设备
。
例如:
- 用键盘输入时,其实就是将输入发送到
标准输入流
,缩写为stdin
,标识为0
。 - 当计算机将输出显示到终端时,使用的就是
标准输出流
,缩写为stdout
,标识为1
。 - 如果计算机需要报告错误,并在终端上显示错误信息,使用的就是
标准错误流
,缩写为stderr
,标识为2
。
使用ls
这个普通的命令,查看这三种输入/输出流
。在键盘上输入ls
,使用的是stdin
。输入ls
后按Enter键
,目录中文件和文件夹的列表通过stdout
显示出来。如果对并不存在的文件夹来运行ls
命令,终端上出现的错误信息就是通过stderr
而提供的。
文件描述符(标识符) |
名称 |
常用缩写名 |
典型的默认设备 |
---|---|---|---|
0 |
标准输入流 |
stdin |
键盘-K |
1 |
标准输出流 |
stdout |
终端-T |
2 |
标准错误流 |
stderr |
终端-T |
重定向输入和输出:
例如,不让输出
呈现在终端上
,可以将输出
重定向到其他程序
。不从键盘
接受输入
,程序从文件
获取输入
。
7.6. 将一个命令的输出 用作 另一个命令的输入
命令1 | 命令2
Unix
是由一些小片段松散连接在一起的,这是句真理。除了管道(pipe
)的概念,没有什么比它更能体现这一原则了。管道就是键盘上的“|”
符号,当把它放在两个命令之间时,它可以将第一个命令的输出
作为第二个命令的输入
。换句话说,|
重定向stdout
,将它发送到第二个命令的stdin
。
下面的例子是,用ls -1
命令显示/etc/apt/
目录中所有的文件和目录,将其输出通过管道
传递给grep
命令,让在这里搜索包含apt
的文件或目录。
root@HP-xw4600:/etc/apt# ls -1
apt.conf.d
preferences.d
sources.list
sources.list.bak
sources.list.d
trusted.gpg
trusted.gpg~
trusted.gpg.d
root@HP-xw4600:/etc/apt# ls -1 | grep apt
apt.conf.d
7.7. 将命令的输出重定向到文件
command > file
通常,输出
是显示在屏幕上的,因此称其为标准输出(stdout)
设备。如果不想将输出结果显示到屏幕上,则可以使用>
(大于号
)字符将输出存到文件中。
root@HP-xw4600:~# ls -1
ruleFTP
root@HP-xw4600:~# ls -1F > newFile.txt
root@HP-xw4600:~# ls -1
newFile.txt
ruleFTP
注意: 在使用>
之前,文件newFile.txt
并不存在。
- 当使用
>
将输出重定向到并不存在的文件
时,就会创建这个文件
。 - 特别需要注意的是,如果文件
newFile.txt
早已存在,它将被完全覆盖
。
7.8. 防止重定向时 覆盖文件
有一种办法可以防止重定向时覆盖文件
,即noclobber
选项。如果将noclobber
设置为on
,bash
就不允许重定向覆盖已经存在的文件
,除非得到你的明确许可
。要打开noclobber
,使用以下命令:
$ set -o noclobber
从现在起,如果要使用重定向并覆盖文件,应该用>|
代替>
root@HP-xw4600:~# ls -1
newFile.txt
ruleFTP
root@HP-xw4600:~# set -o noclobber
root@HP-xw4600:~# ls -1F > newFile.txt
-bash: newFile.txt: 无法覆盖已存在的文件
root@HP-xw4600:~# ls -1F >| newFile.txt
root@HP-xw4600:~#
如果觉得不喜欢或不需要noclobber
,可以把它关了:
$ set +o noclobber
要一直开着noclobber
选项,需要在.bashrc文件
中增加一行set -o noclobber
。
7.9. 将命令的输出追加到文件
command >> file
记住,使用>
重定向时:
- 如果文件
不存在
,就会创建一个新文件
; - 如果文件
已经存在
,则会覆盖已有的文件
。
但是: 如果使用>>
来代替>
,就会把输出追加
到指定文件的底部
(如果文件不存在,就会创建它)。
7.10.将文件作为命令的输入
command < file
通常,通过键盘提供命令的输入,因此称其为标准输入(stdin)设备
。与将stdout
重定向到文件一样,也可以重定向stdin
,让它接受来自文件
而不是键盘的输入
。
这有什么用呢?
有些命令不能直接打开文件,在这种情况下,<
(小于号
)就是你需要的解决方法。
计算 newFile.txt
文件中的行数,可以使用下面的命令:
- 例子1:
wc -l newFile.txt
- 例子2:
wc -l < newFile.txt
- 第一个例子,会输出文件名;
- 第二个不会,因为它仅仅知道从标准输入读取内容。
用cat -n
命令可以看出,这个文件一共有3行。
root@HP-xw4600:~# cat -n newFile.txt
1 this is first line!
2 2nd line!
3 3rd line!
root@HP-xw4600:~# cat newFile.txt
this is first line!
2nd line!
3rd line!
root@HP-xw4600:~# wc -l newFile.txt
3 newFile.txt
root@HP-xw4600:~# wc -l < newFile.txt
3
8.参考文献
[1].Linux命令速查手册:https://book.douban.com/subject/4046184/
OK! 以上,Enjoy~