:ls -lt |是什么意思grep-|头-1 | awk'{print $ 9}'| xargs rm`

时间:2019-03-06 23:17:11

标签: linux shell unix pipeline

此命令的含义是:ls -lt | grep - | head -1 | awk '{print $9}' | xargs rm

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

1 个答案:

答案 0 :(得分:1)

查看长管道做什么的一种简单方法是一次运行一条管道。运行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 $9}'
src/

打印第九列,即文件名。

小心::这时您可以坚持使用| xargs rm,但是rm看起来很危险。不,是吗?不用运行它来查看会发生什么,而是尝试man xargs来了解xargs rm的作用。或Google“ xargs rm”:啊哈,这告诉我它将删除正在传递的文件。很高兴知道,我想我会通过。

将所有内容放在一起,您可以将整体结果描述为“按时间倒序列出文件,找到第一个,然后删除它”。换句话说,删除最新文件。这就是整个过程。