lsの出力を使用して最後に変更されたファイルを開くにはどうすればよいですか?

lsの出力を使用して最後に変更されたファイルを開くにはどうすればよいですか?

ls -ltrwithの出力を使用する方法はありますかxargs

lsの結果が以下のファイルであるとします。

ls -ltr | tail -1 | xargs -I{} open {}

比較のために、次のコマンドを使用して find を使用してファイルを移動しました。

find ~/Downloads/ -iname '*hello*' -print0 | xargs -0 -I{} mv {} ./

どういうわけかNUL文字を使用できますか?


[解決済み]
@illkachuのコメントで述べたように、次のアプローチはうまくいきますが、お勧めできません。

somecmd "$(ls -tr | tail -1)"

ステファンが提案したのが代替案のようでした。

答え1

一般的に言えば、ls

たとえば、

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

最新のファイル名に改行文字が含まれていても効果はありません。

理想的には:

ls -zt | head -zn1 | xargs -r0 open --

lsしかし残念ながら、実装のサポート/オプションはありません。-z-0GNU管理者はls少なくとも何度も追加を拒否しました。

今、他の方法もあります。

CロケールのGNUおよびast-open実装の場合、lsこのオプションを使用した出力は--quoting-style=shell-always通過またはzsh後処理ksh93できますbash

export LC_ALL=C
eval "files=($(ls --quoting-style=shell-always -t))"

open -- "${files[0]}" # $files[1] with zsh

zshではそれだけですが、

open ./*(om[1])

または:

開いている。 /Ctrl+Xm

zsh変更時間(および機能を超える他の多くの基準)でlsファイルをソートする機能が組み込まれています。

FreeBSDにはjsonまたはxml出力を生成するオプションがlsあるので、--libxo次のことができます。

ls --libxo=json -t | perl -MJSON::PP -0777 -l0 -ne '
  print decode_json($_)
    ->{"file-information"}
    ->{directory}->[0]
    ->{entry}->[0]
    ->{name}' | xargs -r0 open --

しかし、そうすれば、すべての作業をperl

答え2

あなたが聞いたように、一般的に言うと、これはあなたが選びたい方法ではありません。しかし、開始は次のとおりです。

ls -ltr | awk '/^-/ { print $9; }' | xargs

関連情報