Могу ли я передать расширение имени пути в команду?

Используя bash, я хочу выполнить то, что делает следующая команда, не используя команду ls, а вместо этого используя чистое расширение пути. Это возможно?

ls * | tail -1

Я ищу что-то вроде

* | tail -1

person Roland    schedule 19.02.2020    source источник
comment
Какова ваша цель? Это просто теоретический вопрос о синтаксисе или у вас есть конкретный вариант использования? tail ожидает что-то от stdin, поэтому вам нужна программа (такая как ls), записывающая что-то в stdout, чтобы вы могли передать это в tail. Эта программа не должна быть ls; вы также можете написать свой собственный.   -  person user1934428    schedule 19.02.2020
comment
@user1934428 user1934428 моя цель — сделать то же самое, что и ls * | tail -1, то есть получить последнее имя файла, соответствующее заданному шаблону. Я создаю список пронумерованных файлов, поэтому после файла 001 я хочу создать файл 002 и т. д. Первый шаг — выяснить, какой самый высокий существующий номер в каталоге   -  person Roland    schedule 19.02.2020
comment
Если вы хотите добиться этого результата, просто напишите это как таковое. Если вам надоело вводить ls, создайте псевдоним или функцию, чтобы назвать ее просто l (на один символ меньше). Кстати, вы не обязательно получите последнее имя файла с этим, потому что, если имя файла содержит символ новой строки, ls разделит его на две строки. Вы безопаснее сначала присваиваете массиву, то есть lsa=(*), а затем получаете доступ к последнему элементу массива.   -  person user1934428    schedule 19.02.2020
comment
Еще одно замечание: результат * неупорядочен. Результат из ls -1 будет упорядочен на основе текущих правил сортировки для ls (которые /могут/ быть неупорядоченными).   -  person Gem Taylor    schedule 19.02.2020


Ответы (2)


Вы можете передать расширенный список * в функцию и вывести последний аргумент:

f() { printf "%s\n" "${@: -1}"; }; f *
person KamilCuk    schedule 19.02.2020

Да, вы можете использовать do this, но * делает не то, что вы думаете. Он расширяется до списка содержимого каталога и пытается выполнить себя как двоичный файл. Это может быть опасно, если содержимое вашего каталога содержит фактические исполняемые файлы, которые не предназначены для запуска.

Вы можете использовать встроенную оболочку, не разветвляя отдельный процесс, чтобы что-то сделать с результатом расширения пути. Например, используя printf()

printf '%s\n' * 

Посмотрите, что происходит, когда вы просто пытаетесь выполнить * в командной строке.

mkdir -p foobar
cd foobar
touch zeezee
*
bash: zeezee: command not found

Вы можете tail результат этого вывода и фильтровать результаты, как вам удобно.

person Inian    schedule 19.02.2020