[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