Saisie automatique du fichier le plus récent

13

J'ai un processus qui crée des fichiers texte dont les noms de fichiers sont basés sur l'horodatage de leur moment de création:

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

Comment puis-je compléter automatiquement le nom de fichier du dernier fichier créé , c'est-à-dire le fichier avec le dernier mtime? Il n'y a aucun moyen d'utiliser la tabulation pour ces fichiers car presque tous les caractères du nom de fichier sont partagés avec un autre fichier. J'espère trouver un raccourci (comme celui Alt .qui complète automatiquement le dernier argument de la dernière commande). J'ai réussi à concocter l'alias suivant qui est excellent pour VIM, mais j'aimerais savoir si un raccourci universel existe que je pouvais utiliser kde-open, sqlite3et d' autres applications.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"
dotancohen
la source
Après avoir lu tout cela, la question ne semble pas encore avoir de réponse satisfaisante sur la façon d'avoir un raccourci clavier pour insérer le dernier chemin de fichier (à la bash et, espérons-le, également parcourir l'ordre chronologique) dans le shell bash?
Roman Susi
@RomanSusi: Cette réponse la plus proche est de Weidenrinde, mais elle insère seulement un littéral $(ls -t|head -1)dans la ligne. Par conséquent, pas de vélo. En l'absence d'une réponse satisfaisante, j'ai accepté la réponse qui m'a le plus appris et qui a le plus d'utilité.
dotancohen
Sûr. Il m'est juste venu à l'esprit que cela pourrait être une fonctionnalité intéressante du shell, et je me suis demandé pourquoi personne ne l'avait encore implémentée.
Roman Susi

Réponses:

6

Supprimez simplement viml'alias. Faites quelque chose comme ça:

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

Vous pouvez ensuite utiliser n'importe quel programme pour ouvrir les derniers fichiers:

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

etc.

Cependant, cela se cassera si vos noms de fichiers ont des espaces ou des caractères étranges, c'est pourquoi vous ne devriez jamais analyserls . Une meilleure façon serait quelque chose comme ça (ajoutez ceci à votre .bashrc):

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

Cette fonction exécutera la commande que vous lui donnerez comme argument et transmettra le résultat de l' findappel (le dernier fichier) à cette commande. Ainsi, vous pouvez faire des choses comme:

latest emacs
latest less

Si vous devez être capable de faire des choses comme mv $(latest) foo/celle-ci à la place:

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
}

Ensuite, pour copier le dernier fichier bar/, vous feriez

latest cp bar

Et vous pouvez toujours faire latest emacsde la même manière qu'auparavant.

terdon
la source
Merci, il y a pas mal de choses que je peux apprendre ici.
dotancohen
Je recommanderais alias latest='\ls -tr | tail -n 1'- cela fonctionnera si vous avez un lsalias.
domen
5

Vous pouvez facilement configurer ceci danszsh , par exemple avec quelque chose comme ceci:

zstyle ':completion:*' file-sort date

(vous pouvez également modifier la ligne de sorte que ce style ne soit utilisé que pour certains modèles de nom de fichier)

zsh est très similaire à bash, vous pourriez probablement l'appeler un surensemble de bash - en termes de fonctionnalité / utilisation.

Mais peut-être que bash a une fonctionnalité similaire.

maxschlepzig
la source
Merci, c'est super. Pour plusieurs raisons, je préfère ne pas déménager, zshmais si jamais je le fais, je l'ai mis en signet!
dotancohen
Merci de m'avoir présenté zsh!
dotancohen
3

Étant donné que le fichier le plus récent est également trié en dernier, vous pouvez utiliser menu-complete-backward. menu-completeet menu-complete-backwardparcourir les achèvements ou insérer le premier ou le dernier achèvement. Je les ai liés à option-tab et shift-tab dans ~/.inputrc:

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

Votre émulateur de terminal peut ne pas s'insérer \e[Zlorsque vous appuyez sur Maj + Tab. Utilisez C-vou cat -vpour voir le texte inséré lorsque vous appuyez sur une combinaison de touches.

Lri
la source
En fait, les fichiers sont triés par ordre alphabétique et non chronologique. Si je trouve comment trier chronologiquement, je mettrai à jour les informations.
dotancohen
2

Le fond de la question est la vitesse d'utilisation. Je trouve une macro clavier la plus appropriée. Ajouter à ~/.inputrc:

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

Autres idées: origine, je voulais quelque chose qui me donne le 1er, 2e, 3e fichier le plus récent. Une idée serait de marquer les lieux avec un jeton, par exemple "grep x _", puis d'exécuter une macro de clavier "\ C-alatest-expansion \ Cm" et "latest-expansion" invite une liste de sélection de curseurs à choisir les derniers fichiers pour chaque jeton "_" dans la ligne de commande.

Je considère que c'est une question importante, car un avantage restant de l'interface graphique sur SHELL est pour moi la sélection des fichiers et répertoires récemment utilisés / créés. autojumpaide un peu pour les répertoires, il manque une solution pour les fichiers.

Weidenrinde
la source
Merci, c'est utile. Notez qu'il insère un littéral $(ls -t|head -1)dans la ligne bash, il doit donc être interprété. Cela le rend moins utile, mais c'est quand même une bonne astuce.
dotancohen