Вы не указывали удар явно, таким образом, я беру свободу предложить Вам очень простое решение для zsh:
ls -d ~/**/*| egrep -v "/.*/.*/.*/"
Если Вы хотите включать точечные файлы также:
ls -d ~/**/*(D)| egrep -v "/.*/.*/.*/"
Они только предполагают, что у Вас нет огромного количества файлов в Вашем доме! Если Вы сделаете, то Вы получите список аргументов слишком длинная ошибка. Но можно столкнуться с подобными ошибками с любым решением, которое дает ответ за один шаг. (Рекурсивная функция звонит также).
Проблема в том, что вам нужно процитировать обратные ссылки в определении псевдонима. Двойные кавычки ("
) не приводят к подстановке команд. Вам понадобятся одинарные кавычки ("
). Используйте
alias via='vim `ls -rt | tail -1`'
Хотя на самом деле:
alias via='vim -- "$(ls -t | head -n 1)"'
То есть:
$(...)
). --
, чтобы отметить конец опции для vim
(иначе это не сработало бы для имен файлов, начинающихся с -
или +
). ls -t -t | head
вместо ls -rt | tail
, чтобы получить результат раньше. Не используйте
alias via="vim `ls -rt | tail -1`"
Если вы это сделаете, подстановка команды произойдет при определении псевдонима, а не при его запуске. Попробуйте набрать псевдоним через
, чтобы увидеть, что на самом деле вывод не является псевдонимом через='vim `ls -rt | tail -1`'
, а скорее псевдоним через='vim
.
В zsh
(также предустановленном на OS/X) и при условии, что вы используете систему завершения (compinit
и co), Ctrl+Xm становится завершающей клавишей, которая расширяется до самого нового файла.
Итак:
vi Ctrl+Xm
Заставляет вас редактировать самый новый файл (вы также получаете шанс увидеть его, прежде чем нажать Return).
vi Alt+2Ctrl+Xm
для второго по новизне файла.
vi *.cCtrl+Xm
для самого нового c
файла.
vi *(.)Ctrl+Xm
для самого нового обычного файла (не каталога, не fifo/device...), и так далее.
Вы также определяете свой псевдоним как:
alias via='vim -- *(.om[1])'
Для редактирования самого нового (не скрытого) регулярного файла в текущем каталоге без проблем, связанных с разбором вывода ls
.
Используя bash
и предполагая реализацию GNU find
и sort
, вы могли бы добиться того же с помощью функции типа:
via() {
local file
IFS=/ read -rd '' file file < <(
find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn
) && vim -- "$file"
}
Которую вы могли бы параметризовать, чтобы иметь возможность указать второй, третий... ... новейший файл (при условии, что GNU Bash 4.4 или новее и GNU coreutils 8.25 или новее):
via() {
local files
readarray -d '' -t files < <(
find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd / -f 2
) && ((${#files[@]} >= ${1-1} )) && vim -- "${files[${1-1}-1]}"
}
Чтобы использовать как:
via 3
например, для редактирования третьего новейшего файла.