Расширение истории на самом деле работает на текущей команде, используя дизайнер событий ! #
. Объедините это со словом Designator для последнего аргумента - $
- Чтобы получить параметр, который вы только что набрали. И вы можете использовать все обычные модификаторы над ним, поэтому, если, например, вы переименяете файл в далеком каталоге, вы можете просто ввести:
mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
Не зная дополнительной информации, вы можете использовать эту команду для выбора последних 2 файлы в этом каталоге и удалите их. Предполагается, что вы хотите, чтобы последние 2 файла были изменены, удалены.
$ ls -t | head -n 2 | xargs rm -f
Допустим, у меня есть эти файлы.
$ seq 5 | xargs -n 1 touch
$ ls -ltr
total 0
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 1
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 2
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 3
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 4
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 5
Использование ls -t | head -n 2
даст мне последние 2 измененных файла.
$ ls -t | head -n 2
5
4
И я могу передать их в xargs rm -f
, чтобы удалить их.
$ ls -t | head -n 2 | xargs rm -f
$ ls -tr
total 0
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 1
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 2
-rw-rw-r--. 1 saml saml 0 Jun 5 04:01 3
С помощью zsh
rm -f -- *(D.om[1,2])
удаляет (до) два самых новых (с точки зрения времени последней модификации) обычных файлов в текущем каталоге.
С инструментами GNU:
eval "files=($(ls -At --quoting-style=shell-always))"
n=2
for f in "${files[@]}"; do
if [[ -f $f && ! -L $f ]]; then
rm -f -- "$f"
((--n)) || break
fi
done