vimで最近変更されたファイルを開く

vimで最近変更されたファイルを開く

次のコマンドは有効です

$ ls -1t | head -1
git_sync_log20180924_00.txt

$ vi git_sync_log20180924_00.txt

しかし、これはそうではありません

$ ls -1t | head -1 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

どうすればよいですか(最近変更されたファイルをviで開く)?

答え1

vi -- "$(ls -t | head -n 1)"

(ファイル名に改行文字が含まれていないと仮定)。

または以下を使用する場合zsh

vi ./*(om[1])

または:

vi ./*(.om[1])

ただ考慮定期的な文書。

vi ./*(.Dom[1])

また考慮隠されたファイルを使用します(を使用するのと同じls -At)。

これは、ファイル名に含まれる文字またはバイト値に関係なく機能します。後者に対応するGNUシェルとユーティリティの場合は、次のことができます。

IFS= read -rd '' file < <(
  find . ! -name . -prune -type f -printf '%T@\t%p\0' | sort -zrn | cut -zf2-) &&
  vi "$file"

答え2

パイプライン構造の場合は、xargs次のように使用できます。

ls -1t | head -1 | xargs vi

答え3

不安定な出力に依存しないより信頼性の高いソリューションが必要な場合、ほとんどの実装には、提供するタイムスタンプまたはAwkスクリプトを含めることができるカスタムls出力形式を指定する方法があります。いくつかの例:stat(1)sort(1)

  • GNU coreutilsの使用:

    stat -L -c '%Y %n' -- *
    
  • BSD coreutilsの使用:

    stat -L -t '%s' -f '%Sm %N' ./*
    

その後、結果を並べ替えてフィルタリングできます。

  • coreutilsのみを使用:

    stat ... | sort -t ' ' -k 1,1 -n -r | head -n 1 | cut -d ' ' -f 2-
    

    最大値だけが必要な場合でも、入力全体をソートするのにO(n log n)時間がかかります。

  • awkを使用してください:

    stat ... | awk -F ' ' 'NR == 1 || $1 > m { m = $1; n = substr($0, length(m) + 2); } END{ if (NR) print(n); }'
    

    これは、最大値のみを比較して更新するため、O(n)時に実行されます。

関連情報