Автоматически заполните новейший файл

Я сожалею, но нет никакой Oracle (исключая: Sun) поддержка Java FreeBSD.

С другой стороны можно использовать порт FreeBSD OpenJDK.

13
13.09.2013, 02:43
6 ответов

Просто удалите vim от псевдонима. Сделайте что-то вроде этого:

alias latest='ls -tr | tail -n 1'

Можно затем использовать любую программу для открытия последних файлов:

emacs `latest`
ls `latest`
mv `latest` ../

и т.д.

Однако это повредится, если Ваши имена файлов будут иметь пробелы или странные символы, который является, почему Вы никогда не должны анализировать ls. Лучший путь был бы чем-то вроде этого (добавьте это к Вашему .bashrc) :

function latest(){
  $1 "$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)"
}

Эта функция выполнит любую команду, которую Вы даете ей как аргумент и передаете результат find звоните (последний файл) к той команде. Так, можно сделать вещи как:

latest emacs
latest less

Если необходимо смочь сделать вещи как mv $(latest) foo/ попробуйте этого вместо этого:

function latest(){
   A=(${@})
   prog=$1;
   lat=$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)
   if [ ! -z $2 ] ; then 
     args=${A[@]:1}; 
     $prog "$lat" "${A[@]:1}"
   else
     $prog "$lat"
   fi
}

Затем для копирования последнего файла в bar/, Вы сделали бы

latest cp bar

И можно все еще сделать latest emacs таким же образом как прежде.

6
27.01.2020, 19:53
  • 1
    Спасибо, существует довольно много вещей, которые я могу изучить здесь. –  dotancohen 13.09.2013, 10:26

Измените функцию завершения bash «_filedir», чтобы разрешить завершение с помощью табуляции с последним именем файла. Вот скрипт, который вы можете sourceсделать так:

#!/bin/sh

_filedir_newest()
{
    local parent="$1"
    if [ "${#parent}" -gt "0" ]; then
        parent="$(compgen -d -- ${1:0:-1})/"
    fi
    newest=$(bash -c "ls -tr $parent | tail -n 1")
    echo "$parent$newest"
} # _filedir_newest()

_filedir()
{
    local IFS=$'\n'

    _tilde "$cur" || return

    local -a toks
    local x reset
    local newest=0

    reset=$(shopt -po noglob); set -o noglob
    toks=( $(compgen -d -- "$cur") )
    IFS=' '; $reset; IFS=$'\n'

    if [[ "$1" != -d ]]; then
        local quoted
        if [[ "$cur" = "?" ]] || [[ "${cur: -2}" = "/?" ]]; then
            cur="${cur:0:-1}"
            newest=1
        fi
        _quote_readline_by_ref "$cur" quoted

        # Munge xspec to contain uppercase version too
        # http://thread.gmane.org/gmane.comp.shells.bash.bugs/15294/focus=15306
        local xspec=${1:+"!*.@($1|${1^^})"}
        reset=$(shopt -po noglob); set -o noglob
        toks+=( $(compgen -f -X "$xspec" -- $quoted) )
        IFS=' '; $reset; IFS=$'\n'

        # Try without filter if it failed to produce anything and configured to
        [[ -n ${COMP_FILEDIR_FALLBACK:-} && -n "$1" && ${#toks[@]} -lt 1 ]] && {
            reset=$(shopt -po noglob); set -o noglob
            toks+=( $(compgen -f -- $quoted) )
            IFS=' '; $reset; IFS=$'\n'
        }
    fi

    if [[ ${#toks[@]} -ne 0 ]]; then
        # 2>/dev/null for direct invocation, e.g. in the _filedir unit test
        compopt -o filenames 2>/dev/null
        if [[ $newest -eq 1 ]]; then
            COMPREPLY+=( $(_filedir_newest "$cur") )
        else
            COMPREPLY+=( "${toks[@]}" )
        fi
    fi
} # _filedir()

_filedir_xspec()
{
    local cur prev words cword
    _init_completion || return

    _tilde "$cur" || return

    local IFS=$'\n' xspec=${_xspecs[${1##*/}]} tmp
    local -a toks
    local newest=0

    if [[ "$cur" = "?" ]] || [[ "${cur: -2}" = "/?" ]]; then
        cur="${cur:0:-1}"
        newest=1
    fi

    toks=( $(
        compgen -d -- "$(quote_readline "$cur")" | {
        while read -r tmp; do
            printf '%s\n' $tmp
        done
        }
        ))

    # Munge xspec to contain uppercase version too
    # http://thread.gmane.org/gmane.comp.shells.bash.bugs/15294/focus=15306
    eval xspec="${xspec}"
    local matchop=!
    if [[ $xspec == !* ]]; then
        xspec=${xspec#!}
        matchop=@
    fi
    xspec="$matchop($xspec|${xspec^^})"

    toks+=( $(
        eval compgen -f -X "'!$xspec'" -- "\$(quote_readline "\$cur")" | {
        while read -r tmp; do
            [[ -n $tmp ]] && printf '%s\n' $tmp
        done
        }
        ))

    if [[ ${#toks[@]} -ne 0 ]]; then
        compopt -o filenames
        if [[ $newest -eq 1 ]]; then
            COMPREPLY=( $(_filedir_newest "$cur") )
        else
            COMPREPLY=( "${toks[@]}" )
        fi
    fi
} # _filedir_xspec()

Его можно добавить к вашему ~/.bashrcвот так (заменить /path/to/the/scriptсоответствующим образом ), чтобы он применялся ко всем сеансам bash:

source /path/to/the/script/_filedir.sh

После установки '?' используется как специальный индикатор для последнего файла в каталоге, например:

eog ~/Downloads/?<TAB>

становится (в одном случае):

eog ~/Downloads/Sunscreen\ Permission\ -\ ToddlerPrimaryElementary.pdf

Этот метод будет работать с любым каталогом, поскольку он интегрирован с системой завершения bash, а не просто сообщает о самом последнем файле в текущем каталоге. Я часто использую это для перемещения недавно загруженных файлов из моего браузера в папку любого проекта, над которым я активно работаю(mv ~/Downloads/?<TAB>.).

Обновлено в 2021 г. -10 -27:Теперь также работает с _filedir_xspecподпрограммами автозаполнения bash. Обновлено 2021 -11 -09:Исправлена ​​ошибка при работе с текущим каталогом из последнего обновления.

2
20.08.2021, 21:58

Так как новейший файл также отсортирован в последний раз, Вы могли использовать menu-complete-backward. menu-complete и menu-complete-backward цикл посредством завершений или вставляет первое или последнее завершение. Я связал их с вкладкой опции и shift-tab в ~/.inputrc:

"\e\t": menu-complete
"\e[Z": menu-complete-backward

Ваш эмулятор терминала не мог бы вставить \e[Z когда Вы нажимаете shift-tab. Использовать C-v или cat -v видеть, какой текст вставляется при нажатии сочетания клавиш.

3
27.01.2020, 19:53
  • 1
    На самом деле файлы отсортированы в алфавитном порядке, не хронологически. Если я выясню, как отсортировать хронологически затем, я обновлю с информацией –  dotancohen 05.10.2016, 18:11

Можно легко настроить это в zsh, например, с чем-то вроде этого:

zstyle ':completion:*' file-sort date

(можно также изменить строку, таким образом, что этот стиль только используется для определенных шаблонов имени файла),

zsh очень похоже на удар, Вы могли, вероятно, назвать его надмножеством удара - feature-/usage-wise.

Но возможно удар имеет подобную функцию.

5
27.01.2020, 19:53
  • 1
    Спасибо, здорово. По нескольким причинам я предпочитаю не перемещаться в zsh но если я когда-нибудь делаю, мне отметили это! –  dotancohen 13.09.2013, 10:25
  • 2
    Спасибо за представление меня к zsh! –  dotancohen 24.06.2014, 20:52

Подоплекой вопроса является скорость использования. Я считаю, что наиболее подходящим является клавиатурный макрос. Добавить в ~/.inputrc:

# Alt-L --> newest file in directory
"\el": "$(ls -t|head -1)"

Дополнительные идеи: Первоначально я хотел что-то, что дает мне 1-й, 2-й, 3-й самый новый файл. Идея заключается в том, чтобы отметить места маркером, например, "grep x _", затем выполнить макрос клавиатуры "\C-alatest-expansion \C-m" и "latest-expansion" предлагает список выбора в curses, чтобы выбрать из последних файлов для каждого маркера "_" в командной строке.

Я считаю это важным вопросом, потому что одним из оставшихся преимуществ GUI перед SHELL для меня является выбор недавно использованных/созданных файлов и каталогов. autojump немного помогает для каталогов, решение для файлов отсутствует.

2
27.01.2020, 19:53

Мой взгляд на это сочетает в себе findкоманду отличного -как -обычного -terdon AA и .inputrcтрюк от @weidenrinde, но идет немного дальше:

Я сопоставил .,nдля прозрачной вставки последнего измененного файла в текущую позицию в командной строке:

$ grep.,n ~/.inputrc 
".,n": "\C-u`find. -type f -printf \"%C@ %p\\n\" | sort | tail -n 1 | cut -d \" \" -f 2-`\e\C-e\C-a\C-y\C-e"

Хитрость заключается в использовании \C-e\eв конце для оценки вставленной команды поиска на месте.

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

0
27.08.2021, 17:31

Теги

Похожие вопросы