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
-0
GNUの保守者はls
少なくとも何度かそれを追加することを拒否した。。
現在、いくつかの実装では他の方法もあります。
の GNU および ast-open 実装ではls
、C ロケールで オプションを指定した出力は、または--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
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