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

おすすめ記事