`ls -lt | 的含义是什么? grep- |头-1 | awk '{print $9}' | xargs rm`

What is the meaning of : `ls -lt | grep - | head -1 | awk '{print $9}' | xargs rm`

这条命令的含义是什么:ls -lt | grep - | head -1 | awk '{print }' | xargs rm

我知道这些命令的各自含义,但是当我们通过管道连接它们时会发生什么?

查看长管道的作用的一种简单方法是 运行 一次一条。 运行 ls -lt,然后是 ls -lt | grep -,然后是 ls -lt | grep - | head -1,等等。看看每个命令的中间输出是什么,这样你就知道下一个输入的是什么。

$ cd /usr
$ ls -lt
total 156
drwxr-xr-x  11 root root  4096 Mar  6 06:35 src/
drwxr-xr-x   2 root root 90112 Mar  5 06:27 bin/
drwxr-xr-x   2 root root 12288 Mar  5 06:27 sbin/
drwxr-xr-x 155 root root  4096 Mar  5 06:27 lib/
drwxr-xr-x  50 root root 20480 Feb 20 18:11 include/
drwxr-xr-x 330 root root 12288 Feb 18 16:58 share/
drwxr-xr-x   2 root root  4096 Oct 19 13:51 games/
drwxr-xr-x   3 root root  4096 Jul 19  2016 locale/
drwxr-xr-x  10 root root  4096 Jul 19  2016 local/

文件列表,每个条目各占一行,以及权限、大小和其他信息。查看 man ls 我看到 -t 标志表示文件按修改时间排序,从最新到最旧。

$ ls -lt | grep -
drwxr-xr-x  11 root root  4096 Mar  6 06:35 src/
drwxr-xr-x   2 root root 90112 Mar  5 06:27 bin/
drwxr-xr-x   2 root root 12288 Mar  5 06:27 sbin/
drwxr-xr-x 155 root root  4096 Mar  5 06:27 lib/
drwxr-xr-x  50 root root 20480 Feb 20 18:11 include/
drwxr-xr-x 330 root root 12288 Feb 18 16:58 share/
drwxr-xr-x   2 root root  4096 Oct 19 13:51 games/
drwxr-xr-x   3 root root  4096 Jul 19  2016 locale/
drwxr-xr-x  10 root root  4096 Jul 19  2016 local/

似乎删除了 "total 156" 行。 (如果这是目标,那是一种相当糟糕的方法。不能保证每一行都有破折号,这正是 grep - 正在寻找的。具有完整 rwxrwxrwx 权限的文件不会行中没有破折号。)

$ ls -lt | grep - | head -1
drwxr-xr-x  11 root root  4096 Mar  6 06:35 src/

获取之前grep结果的第一行。

$ ls -lt | grep - | head -1 | awk '{print }'
src/

打印第九列,文件名。

小心: 此时你可以继续 | xargs rm,但 rm 看起来很危险。我们不要,嗯?我不会 运行 看看会发生什么,而是尝试 man xargs 看看 xargs rm 做了什么。或者 google "xargs rm":啊哈,这告诉我它将删除传入的文件。很高兴知道——我想我会通过。

将所有部分放在一起,您可能会将整体结果描述为 "list files in reverse chronological order, find the first, and delete it"。或者换句话说,删除最新的文件。这就是整个事情的作用。