最後に変更されたファイルを開くエイリアスを作成します。

最後に変更されたファイルを開くエイリアスを作成します。

私がよくすることは、最近変更されたファイルを編集することです。だから、「ls -lr」と入力してから「vim lastfile」と入力する代わりに、~/.bash_profileファイルにいくつかのショートカットを作成したいと思いました。

alias via="vim `ls -rt | tail -1`"
alias vib="vim `ls -rt | tail -2 | head -1`"
alias vic="vim `ls -rt | tail -3 | head -1`"
alias vid="vim `ls -rt | tail -4 | head -1`"
alias vie="vim `ls -rt | tail -5 | head -1`"

奇妙なことに、問題はこれらのコマンドが機能しないことです。彼らは最後のファイルではなくいくつかのファイルを開いて、現在のディレクトリからファイルを削除しました(そのディレクトリにどのようなファイルキャッシュ更新の問題があるのか​​疑問に思います。これは私のローカルコンピュータと私のクラスタで発生します)。 。

しかし、vim `ls -rt | tail -1`エイリアスを使わずに直接入力すると、毎回機能します。

答え1

問題は、エイリアス定義でバックティックを引用する必要があることです。二重引用符(")はコマンド置換を引用しません。一重引用符()が必要です'。使用

alias via='vim `ls -rt | tail -1`'

実際には次のものが欲しいが:

alias via='vim -- "$(ls -t | head -n 1)"'

それは:

  • $(...)これを行うには、現代的な形式のコマンド置換()を使用してください。
  • これを引用して分割+glob演算子を無効にします。そうしないと、ファイル名にIFS文字またはワイルドカードが含まれていると正しく機能しません(改行文字がある場合はまだ機能しません)。
  • --オプションの終わりを表示するために使用されます(それ以外の場合、vimまたはで始まるファイル名には影響しません)。-+
  • ls -t | head結果をすばやく取得するには、代わりに使用してくださいls -rt | tail

使用しないでください

alias via="vim `ls -rt | tail -1`"

これにより、エイリアスを実行するのではなく、エイリアスを定義するときにコマンド置換が発生します。alias via実際に出力ではalias via='vim `ls -rt | tail -1`'ないことを確認するには、入力してみてくださいalias via='vim <prematurely expanded output>'

答え2

zsh(OS / Xにもプリインストールされています)を使用して完成システム(compinitおよび共同)を使用すると仮定すると、Ctrl+Xm最新のファイルに拡張される完成者になります。

だから:

Ctrl+Xm

最新のファイルを編集できます(を押す前にそのファイルを表示することもできますReturn)。

Alt+2Ctrl+Xm

2番目の最新ファイルの場合。

6*.cCtrl+Xm

最新のcファイルを入手してください。

肉*(.)Ctrl+Xm

最新のために定期的なファイル(ディレクトリではない、fifo / devicesではない...)など

また、別名を次のように定義します。

alias via='vim -- *(.om[1])'

解析せずに現在のディレクトリで最新(非表示)の一般ファイルを編集しますls

とのGNU実装を想定すると、bash次の関数を使用して同じ効果を得ることができます。findsort

via() {
  local file
  IFS=/ read -rd '' file file < <(
    find . -maxdepth 1 -type f  ! -name '.*' -printf '%T@/%f\0' |
    sort -rzn
  ) && vim -- "$file"
}

2番目、3番目...最新のファイルを指定できるようにパラメータ化できます(GNU Bash 4.4以降とGNU coreutils 8.25以降を想定)。

via() {
  local files
  readarray -d '' -t files < <(
    find . -maxdepth 1 -type f  ! -name '.*' -printf '%T@/%f\0' |
    sort -rzn | cut -zd / -f 2
  ) && ((${#files[@]} >= ${1-1} )) && vim -- "${files[${1-1}-1]}"
}

次のように使用されます。

via 3

たとえば、3番目の最新のファイルを編集します。

関連情報