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

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

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

ls の結果が以下のように 1 つのファイルであると仮定します。

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少なくとも何度かそれを追加することを拒否した。

現在、いくつかの実装では他の方法もあります。

の GNU および ast-open 実装ではls、C ロケールで オプションを指定した出力は、または--quoting-style=shell-alwaysによって後処理可能です。zshksh93bash

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

as には、変更時間 (および機能をはるかに超える他の多くの基準)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

関連情報