Что означает: `ls -lt |grep - |голова -1 |awk '{print $ 9}' |xargs rm` - PullRequest
0 голосов
/ 07 марта 2019

Что означает эта команда: ls -lt | grep - | head -1 | awk '{print $9}' | xargs rm.

Я знаю индивидуальный смысл этих команд, но что происходит, когда мы присоединяемся к ним по трубе?

1 Ответ

1 голос
/ 07 марта 2019

Простой способ увидеть, что делают длинные конвейеры, - запускать их по одному.Запустите 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/

Появляется для удаления строки «всего 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": ага, это говорит мне, что он удалит передаваемые файлы. Полезно знать - я думаю, что передам.

Соберите все части вместе, и вы могли бы описатьобщий результат в виде «перечислить файлы в обратном хронологическом порядке, найти первый и удалить его».Или, другими словами, удалить самый новый файл .Это то, что делает все это.

...