[Linux]常用命令、组合命令以及输入输出重定向

2020-03-10阅读 1580
 
原创文章

文章目录

  • 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.创建文件和目录touchmkdir

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);
  • 再向左一列,显示文件所属的(以上的例子组有qfxrootdiskcdrom等);
  • 再向左一列,显示文件的所有者(以上的例子所有者只有qfxroot);
  • 在向左一列,包含了一个数字。如果你正在处理一个文件,这个数字可以告诉你该文件有多少个硬链接(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,如果原本要出现rwx的位置出现了-,就表示不允许读写不允许改写不允许执行

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设置为onbash就不允许重定向覆盖已经存在的文件,除非得到你的明确许可。要打开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~

[Linux]常用命令、组合命令以及输入输出重定向的更多相关文章

  1. ## 本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘

    本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘一,磁盘管理1.显示当前目录位置 pwd2.切换目录 cd ...

  2. Linux 常用的压缩命令有 gzip 和 zip

    Linux 常用的压缩命令有 gzip 和 zip,两种压缩包的结尾不同:zip 压缩的后文件是 *.zip ,而 gzip 压缩后的文件 *.gz 相应的解压缩命令则是 gunzip 和 unzip ...

  3. linux常用60条命令 转

    Linux必学的60个命令   Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命 ...

  4. LINUX常用配置及命令

    一.   Fedora系统配置 1.      [设置网卡IP] 步骤如下: 1)     用root用户登陆,打开/etc/sysconfig/network-scripts/ifcfg-eth0文 ...

  5. Linux常用的基础命令总结

    man 查看英文命令帮助   可以看作--help 拷贝目录的命令cp -a  包含所有 ls -a 显示所有文件包括隐藏文件  -ld ls -F 过滤目录文件(给不同类型文件结尾加上不同的符号) ...

  6. 入门学习Linux常用必会命令实例详解

    Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...

  7. 网络编程学习笔记-linux常用的网络命令

    网络参数设置命令 所有时刻如果你想要做好自己的网络参数设置,包括IP参数.路由参数和无线网络等,就得要了解下面这些相关的命令才行.其中Route及ip这两条命令是比较重要的.当然,比较早期的用法,我们 ...

  8. linux常用20条命令

    1.cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切换到 ...

  9. LINUX常用操作命令和命令行编辑快捷键

    终端快捷键: Ctrl + a/Home 切换到命令行开始 Ctrl + e/End 切换到命令行末尾 Ctrl + l 清除屏幕内容,效果等同于clear Ctrl + u 清除剪切光标之前的内容 ...

  10. Java线上问题排查思路及Linux常用问题分析命令学习

    前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...

随机推荐

  1. vue 快速入门 系列 —— 侦测数据的变化 - [vue 源码分析]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue 源码分析] 本文将 vue 中与数据侦测相关的源码摘了出来,配合上文(侦测数据的变化 - [基本实现]) 一起来分析一下 vue ...

  2. Java开发工程师面试-基础

    JDK.JRE.JVM有什么区别? JDK:Java Development Kit 针对Java程序员的产品 JRE:Java Runtime Environment是运行Java的环境集合 JVM ...

  3. 全网最详细的Linux命令系列-nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  4. 【DB宝47】企业知识分享+团队协作神器之Confluence

    目录 一.Confluence简介 二.知识库软件对比 三.快速安装confluence 7.4.6版本 四.confluence基本操作简介 4.1.创建空间(Space) 4.2.配置空间权限 4 ...

  5. Android通过Web与后台数据库交互

    2021.1.27 更新 已更新新版本博客,更新内容与原文章相比有点多,因此新开了一篇博客,请戳这里. 1 背景 开发一个App与后台数据库交互,基于MySQL+原生JDBC+Tomcat,没有使用D ...

  6. 14. VUE 子组件修改父组件的值

    在 Vue 当中,父组件 -> 子组件 传值,都是通过属性的形式传递的. 子组件 修改 传递数据 直接操作父组件传递过来的值,用是可以用的,但是打开控制台后,会发现 Vue 有个警告:你不要直接 ...

  7. 在Linux CentOS上搭建Jmeter压测环境

    本文的主要内容是介绍如何在Linux CentOS 服务器上面搭建Jmeter的压测环境整个详细的流程,来满足我们日常工作中对于压力测试环境搭建.压力测试执行过程的需求. 一.首先我们要准备四个东西, ...

  8. Bug Hunt UVA - 1596

      In this problem, we consider a simple programming language that has only declarations of onedimens ...

  9. Mediapipe 在RK3399PRO上的初探(二)(自定义Calculator)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. 计算机网络-已知IP地址和子网掩码,求广播地址

    首先说结论--广播地址=该IP所在的下一跳-1 例题: 已知IP地址是192.72.20.111,子网掩码是255.255.255.224,求广播地址 要知道下一跳就需要先求出网段间隔,网段间隔=25 ...