Autouzupełnianie najnowszego pliku


13

Mam proces, który tworzy pliki tekstowe, których nazwy plików są oparte na sygnaturze czasowej ich momentu utworzenia:

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

Jak mogę automatycznie uzupełnić nazwę pliku ostatnio utworzonego pliku , tj. Pliku z najnowszym mtime? W tych plikach nie ma możliwości użycia uzupełniania tabulatorami, ponieważ prawie każdy znak w nazwie pliku jest współdzielony z innym plikiem. Mam nadzieję znaleźć skrót (taki, Alt .który automatycznie uzupełnia ostatni argument ostatniego polecenia). Udało mi się wymyślać następujące alias co jest dobre dla VIM, ale chciałbym wiedzieć, czy skrót ogólnego przeznaczenia istnieje, że mogę korzystać z kde-open, sqlite3i inne aplikacje.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"


Po przeczytaniu tego wszystkiego wydaje się, że nie ma jeszcze zadowalającej odpowiedzi na pytanie, jak użyć skrótu klawiaturowego, aby wstawić najnowszą ścieżkę do pliku (zakończenie la bash i, mam nadzieję, również cyklicznie) w powłoce bash?
Roman Susi

@RomanSusi: Najbliższa odpowiedź pochodzi od Weidenrinde, ale wstawia dosłowny $(ls -t|head -1)wiersz. Dlatego nie jeździsz na rowerze. Wobec braku zadowalającej odpowiedzi zaakceptowałem odpowiedź, która nauczyła mnie najbardziej i zapewnia największą użyteczność.
dotancohen

Pewnie. Właśnie przyszło mi do głowy, że może to być fajna funkcja powłoki i zastanawiałem się, dlaczego nikt jej jeszcze nie wdrożył.
Roman Susi

Odpowiedzi:


6

Po prostu usuń vimz aliasu. Zrób coś takiego:

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

Następnie możesz użyć dowolnego programu do otwarcia najnowszych plików:

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

itp.

Spowoduje to jednak uszkodzenie, jeśli w nazwach plików występują spacje lub dziwne znaki, dlatego nigdy nie należy analizowaćls . Lepszym sposobem byłoby coś takiego (dodaj to do swojego .bashrc):

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

Ta funkcja wykona dowolne polecenie podane jako argument i przekaże wynik findwywołania (najnowszy plik) do tego polecenia. Możesz więc robić takie rzeczy jak:

latest emacs
latest less

Jeśli chcesz robić takie rzeczy, mv $(latest) foo/spróbuj tego zamiast tego:

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
}

Następnie, aby skopiować plik do najnowszej bar/, zrobiłbyś

latest cp bar

I nadal możesz to robić latest emacsw taki sam sposób, jak wcześniej.


Dziękuję, jest wiele rzeczy, których mogę się tutaj nauczyć.
dotancohen

Polecam alias latest='\ls -tr | tail -n 1'- zadziała, jeśli masz lsalias.
domen

6

Możesz to łatwo skonfigurowaćzsh np. Za pomocą czegoś takiego:

zstyle ':completion:*' file-sort date

(możesz także zmienić linię tak, aby ten styl był używany tylko dla niektórych wzorców nazw plików)

zsh jest bardzo podobny do bash, prawdopodobnie można nazwać go nadzbiorem bash - pod względem funkcji / użytkowania.

Ale może bash ma podobną funkcję.


Dzięki, to świetnie. Z kilku powodów wolę się nie przeprowadzać, zshale jeśli kiedykolwiek to zrobię, mam tę zakładkę!
dotancohen

Dziękujemy za zapoznanie się z zsh!
dotancohen

3

Ponieważ najnowszy plik jest również posortowany jako ostatni, możesz użyć menu-complete-backward. menu-completei menu-complete-backwardcyklicznie wykonuj uzupełnienia lub wstaw pierwsze lub ostatnie uzupełnienie. Powiązałem je z kartami opcji i klawiszem Shift w ~/.inputrc:

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

Twój emulator terminala może się nie wstawić \e[Zpo naciśnięciu klawisza Shift. Użyj C-vlub, cat -vaby zobaczyć, jaki tekst jest wstawiany po naciśnięciu kombinacji klawiszy.


W rzeczywistości pliki są sortowane alfabetycznie, a nie chronologicznie. Jeśli wymyślę, jak sortować chronologicznie, zaktualizuję informacje.
dotancohen

2

Tłem pytania jest szybkość użytkowania. Uważam, że makro klawiatury jest najbardziej odpowiednie. Dodaj do ~/.inputrc:

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

Dalsze pomysły: pierwotnie chciałem czegoś, co da mi pierwszy, drugi, trzeci plik. Pomysłem byłoby oznaczenie miejsc tokenem, np. „Grep x _”, a następnie wykonanie makra klawiatury „\ C-alatest-extension \ Cm”, a „najnowsze-rozszerzenie” wyświetla listę wyboru przekleństw do wyboru najnowsze pliki dla każdego tokena „_” w wierszu poleceń.

Uważam to za ważne pytanie, ponieważ jedną z pozostałych zalet GUI nad SHELL jest dla mnie wybór ostatnio używanych / utworzonych plików i katalogów. autojumppomaga trochę dla katalogów, brakuje rozwiązania dla plików.


Dziękuję, to jest pomocne. Zauważ, że wstawia literał $(ls -t|head -1)do linii bash, więc należy go interpretować. To sprawia, że ​​jest mniej przydatny, ale wciąż jest fajną sztuczką.
dotancohen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.