Автозаповнення найновішого файлу


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`"


Прочитавши все це, начебто, питання поки що не має задовільної відповіді про те, як мати ярлик на клавіатурі, щоб вставити останній filepath (а-ля баш завершення, і, сподіваємось, також прокрутити в хронологічному порядку) в оболонку bash?
Роман Сусі

@RomanSusi: Ця найближча відповідь - Вайденрінде, але вона лише вставляє буквальний $(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псевдонім.
domen

6

Ви можете легко налаштувати цеzsh , наприклад, із чимось подібним:

zstyle ':completion:*' file-sort date

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

zsh дуже схожий на bash, ви, ймовірно, можете назвати це набором bash - особливості / використання.

Але, можливо, баш має схожу особливість.


Спасибі, це чудово. З кількох причин я вважаю за краще не переїжджати, zshале якщо я коли-небудь буду, у мене є це закладка!
dotancohen

Дякую, що познайомили мене zsh!
dotancohen

3

Оскільки найновіший файл також відсортований останнім, ви можете використовувати його menu-complete-backward. menu-completeі menu-complete-backwardпереходити через завершення або вставити перше або останнє завершення. Я прив’язав їх до вкладки параметрів і вкладки shift ~/.inputrc:

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

Ваш емулятор термінала може не вставлятись \e[Zпри натисканні клавіші shift. Використовуйте C-vабо, cat -vщоб побачити, який текст вставляється під час натискання комбінації клавіш.


Фактично файли сортуються за алфавітом, а не хронологічно. Якщо я зрозумію, як сортувати хронологічно, то я буду оновити інформацію.
dotancohen

2

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

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

Подальші ідеї: Спочатку я хотів щось, що дає мені 1-й, 2-й, 3-й новітні файли. Ідея полягала б у тому, щоб позначити місця токеном, наприклад, "grep x _", а потім виконати макрос клавіатури "\ C-alatest-extension \ Cm", а "остання розширення" запрошує список вибору прокльонів для вибору останні файли для кожного маркера "_" у командному рядку.

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


Дякую, це корисно. Зауважте, що він вставляє буквал $(ls -t|head -1)у лінію bash, тому його потрібно інтерпретувати. Це робить його менш корисним, але це все-таки приємний трюк.
dotancohen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.