オートコンプリートの最新ファイル


13

ファイル名が作成時のタイムスタンプに基づいているテキストファイルを作成するプロセスがあります。

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

最後に作成されたファイル、つまり最新のmtimeを持つファイルのファイル名を自動補完するにはどうすればよいですか?ファイル名のほとんどすべての文字が別のファイルと共有されるため、これらのファイルにタブ補完を使用する方法はありません。ショートカット(Alt .最後のコマンドの最後の引数を自動補完するショートカットなど)を見つけたいと思っています。私はのために素晴らしいです、次の別名をでっち上げるために管理しているVIMが、私は、汎用のショートカットは、私が使うことができることが存在するかどうかを知るのが大好きだkde-opensqlite3と、他のアプリケーション。

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


それをすべて読んだ後、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エイリアスを持っている場合、これは動作します。
-domen

5

あなたはすることができます簡単にこの中を設定するzshなど、このようなもので、:

zstyle ':completion:*' file-sort date

(このスタイルが特定のファイル名パターンにのみ使用されるように行を変更することもできます)

zsh bashに非常に似ていますが、おそらくbashのスーパーセットと呼ぶことができます-機能/使用法。

しかし、おそらくbashにも同様の機能があります。


ありがとう、これは素晴らしい。いくつかの理由で、私はに移動しzshたくないが、私がこれまでにした場合、私はこれをブックマークしています!
dotancohen

私を紹介してくれてありがとうzsh
dotancohen

3

最新のファイルも最後にソートされるため、を使用できますmenu-complete-backward。完了menu-completemenu-complete-backward循環するか、最初または最後の完了を挿入します。私はそれらをoption-tabとshift-tabにバインドしました~/.inputrc

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

\e[Zshift-tabを押すと、端末エミュレーターが挿入されない場合があります。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-expansion \ Cm」を実行し、「latest-expansion」がcurses-selectionリストから選択するプロンプトを出すことを考えますコマンドラインの各「_」トークンの最新ファイル。

シェルに対するGUIの利点の1つは、最近使用/作成されたファイルとディレクトリを選択できることだからです。autojumpディレクトリに少し役立ちますが、ファイルの解決策がありません。


ありがとう、それは役に立ちます。$(ls -t|head -1)bash行にリテラルを挿入するため、解釈する必要があることに注意してください。それはあまり有用ではありませんが、それでも素晴らしいトリックです。
-dotancohen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.