Автозаполнение новейшего файла

13

У меня есть процесс, который создает текстовые файлы, имена файлов которых основаны на отметке времени их создания:

$ ls
1378971222.txt
1378971254.txt
1378971482.txt
1378971488.txt
1378972089.txt
1378972140.txt
1378972141.txt
1378972153.txt
1378972155.txt
1378972241.txt

Как я могу автоматически заполнить имя файла последнего созданного файла , то есть файла с последним mtime? Невозможно использовать Tab-завершение для этих файлов, так как почти каждый символ в имени файла используется совместно с другим файлом. Я надеюсь найти ярлык (например, Alt .который автоматически завершает последний аргумент последней команды). Мне удалось состряпать следующий псевдоним , который отлично подходит для VIM, но я хотел бы знать , если универсальный ярлык существует , что я мог бы использовать с kde-open, sqlite3и другими приложениями.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"
dotancohen
источник
Прочитав все это, вопрос, похоже, пока не дал удовлетворительного ответа о том, как получить комбинацию клавиш для вставки последнего пути к файлу (завершение а-ля bash и, надеюсь, также циклический переход в хронологическом порядке) в оболочке bash?
Роман Суси
@RomanSusi: этот ближайший ответ - Weidenrinde, но он вставляет $(ls -t|head -1)в строку только литерал . Поэтому не ездить на велосипеде. В отсутствие удовлетворительного ответа, я принял ответ, который научил меня больше всего и обеспечивает наибольшую полезность.
Dotancohen
Конечно. Мне просто пришло в голову, что это может быть классная функция оболочки, и удивился, почему никто еще не реализовал ее.
Роман Суси

Ответы:

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же, как и раньше.

Тердон
источник
Спасибо, есть несколько вещей, которые я могу выучить здесь.
Dotancohen
Я бы порекомендовал alias latest='\ls -tr | tail -n 1'- это будет работать, если у вас есть lsпсевдоним.
Домен
5

Вы можете легко настроить этоzsh , например, так:

zstyle ':completion:*' file-sort date

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

zsh очень похож на bash, вы, вероятно, можете назвать его расширенным набором bash - с точки зрения возможностей / использования.

Но, возможно, Bash имеет аналогичную особенность.

maxschlepzig
источник
Спасибо, это здорово. По нескольким причинам я предпочитаю не переходить, zshно если я когда-либо сделаю это, я добавлю это в закладки!
Dotancohen
Спасибо, что познакомили меня с zsh!
dotancohen
3

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

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

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

LRI
источник
На самом деле файлы сортируются по алфавиту, а не по хронологии. Если я выясню, как сортировать в хронологическом порядке, я обновлю информацию.
dotancohen
2

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

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

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

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

Weidenrinde
источник
Спасибо, это полезно. Обратите внимание, что он вставляет литерал $(ls -t|head -1)в строку bash, поэтому его необходимо интерпретировать. Это делает его менее полезным, но это все еще хороший трюк.
dotancohen