Есть ли способ использовать вывод ls -ltr
with 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