Как использовать вывод 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/ -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

имеет zshвстроенную поддержку сортировки файлов по времени изменения (и многим другим критериям, выходящим далеко за lsрамки возможностей).

FreeBSD lsимеет --libxoвозможность генерировать выходные данные в формате json или xml, поэтому вы можете сделать следующее:

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

Связанный контент