Bash — печать перевернутого списка файлов с помощью glob

Этот вопрос устарел, и =gnome-extra/cinnamon-3.0.7-r2теперь доступен непосредственно в дереве портежей. Таким образом, простой emerge gnome-extra/cinnamonдолжен работать на сегодняшний день. Справочная информация находится на странице Gentoo Wiki Cinnamon .

В моей системе vanille GNOME вывод выглядит следующим образом:

# emerge --ask --tree gnome-extra/cinnamon

These are the packages that would be merged, in reverse order:

Calculating dependencies... done!
[ebuild  N     ] gnome-extra/cinnamon-3.0.7-r2::gentoo  USE="networkmanager     nls" PYTHON_TARGETS="python2_7 python3_5 -python3_4" 2.994 KiB
[ebuild  N     ]  gnome-extra/nemo-3.0.6::gentoo  USE="exif introspection nls (-packagekit) {-test} -tracker -xmp" 1.332 KiB
[ebuild  N     ]  gnome-extra/cinnamon-control-center-3.0.1::gentoo  USE="colord cups systemd -debug" INPUT_DEVICES="-wacom" 3.745 KiB
[ebuild  N     ]  x11-wm/muffin-3.0.5::gentoo  USE="introspection {-test} -xinerama" 2.655 KiB
[ebuild  N     ]  gnome-extra/cinnamon-screensaver-3.0.1::gentoo  USE="pam systemd -debug -doc" PYTHON_TARGETS="python2_7" 144 KiB
[ebuild  N     ]  gnome-extra/cinnamon-session-3.0.1::gentoo  USE="ipv6 systemd -doc" 579 KiB
[ebuild  N     ]  gnome-extra/cinnamon-settings-daemon-3.0.1::gentoo  USE="colord cups systemd -smartcard {-test}" INPUT_DEVICES="-wacom" 2.845 KiB
[ebuild  N     ]   gnome-extra/cinnamon-desktop-3.0.2:0/4::gentoo  USE="introspection systemd" PYTHON_TARGETS="python2_7" 565 KiB
[ebuild  N     ]  gnome-extra/cjs-3.0.1::gentoo  USE="cairo gtk -examples {-test}" 318 KiB
[ebuild  NS    ]   dev-lang/spidermonkey-24.2.0-r4:24::gentoo [1.8.5-r6:0/mozjs185::gentoo, 38.2.1_rc0:38::gentoo] USE="system-icu -debug -icu -jit -   minimal -static-libs {-test}" 15.262 KiB
[nomerge       ] x11-wm/muffin-3.0.5::gentoo  USE="introspection {-test} -xinerama" 
[ebuild  N     ]  app-text/gnome-doc-utils-0.20.10-r1::gentoo  PYTHON_TARGETS="python2_7" 515 KiB
[nomerge       ] gnome-extra/cinnamon-3.0.7-r2::gentoo  USE="networkmanager nls" PYTHON_TARGETS="python2_7 python3_5 -python3_4" 
[ebuild  N     ]  gnome-extra/cinnamon-menus-3.0.2::gentoo  USE="introspection -debug" 207 KiB
[ebuild  N     ]  dev-python/pypam-0.5.0-r3::gentoo  PYTHON_TARGETS="python2_7 python3_5 -python3_4 -python3_6" 103 KiB
[ebuild  N     ]  dev-python/pyinotify-0.9.6::gentoo  USE="-examples" PYTHON_TARGETS="python2_7 python3_5 (-pypy) (-pypy3) -python3_4 -python3_6" 60 KiB
[nomerge       ] app-text/gnome-doc-utils-0.20.10-r1::gentoo  PYTHON_TARGETS="python2_7" 
[ebuild  N     ]  app-text/scrollkeeper-dtd-1.0-r1:1.0::gentoo  11 KiB
[nomerge       ] gnome-extra/cinnamon-3.0.7-r2::gentoo  USE="networkmanager nls" PYTHON_TARGETS="python2_7 python3_5 -python3_4" 
[ebuild  N     ]  dev-python/pexpect-4.2.1::gentoo  USE="-doc -examples {-test}" PYTHON_TARGETS="python2_7 python3_5 (-pypy) (-pypy3) -python3_4 -python3_6" 141 KiB
[ebuild  N     ]   dev-python/ptyprocess-0.5.1::gentoo  USE="{-test}" PYTHON_TARGETS="python2_7 python3_5 (-pypy) (-pypy3) -python3_4 -python3_6" 67 KiB
[ebuild  N     ]  dev-python/polib-1.0.7::gentoo  USE="-doc" PYTHON_TARGETS="python2_7 python3_5 -python3_4 -python3_6" 153 KiB
[ebuild  N     ]  gnome-extra/cinnamon-translations-3.0.3::gentoo  7.753 KiB

Total: 19 packages (18 new, 1 in new slot), Size of downloads: 39.440 KiB

В будущих версиях установка пакета с маской ключевого слова будет работать следующим образом в соответствии с Gentoo Handbook . Скажем, вы обнаружите, что дерево портежей заставляет вас идти в ногу с =gnome-extra/cinnamon-3.6.6.-r2, тогда вы вручную принимаете для него ключевое слово:

$ eix -s cinnamon

* gnome-extra/cinnamon
 Verfügbare Versionen:   3.0.7-r2 ~3.2.0-r2 ~3.2.6-r1 ~3.2.7-r1 ~3.4.2-r1 ~3.4.6 ~3.6.6-r2 {+networkmanager +nls PYTHON_TARGETS="python2_7 python3_4 python3_5"}
 Startseite:             http://developer.linuxmint.com/
 Beschreibung:           A fork of GNOME Shell with layout similar to GNOME 2

Согласно базе знаний, добавьте запись, относящуюся к версии , помеченной ~, которую вы хотите/etc/portage/package.keyword/gnome-extra

# echo "=gnome-extra/cinnamon-3.6.6-r2" >> /etc/portage/package.keywords/gnome-extra

А затем emergeэтот пакетный атом (и см. здесь вики-страницу Сакаки для терминологии). Я добавил --pretend, чтобы показать, что будет сделано:

# emerge --ask --verbose --pretend --tree =gnome-extra/cinnamon-3.6.6-r2

Полученный список, скорее всего, даст вам больше пакетов, которые нужно разоблачить. Затем вы можете решить, какую версию использовать, в зависимости от последующих -изменений версии, которые могут потребоваться одному пакету, повторите команду, опуская --pretend, когда вы закончите. Проверьте опции portage для добавления ключевого слова и автоматического снятия маски для более подробной информации.

1
05.01.2020, 05:04
3 ответа

Предполагая, что этот вопрос касается обращения списка, полученного в результате шаблона подстановки имени файла, а не повторной реализации точного вывода ls -r.

Получить результат совпадения glob, например,. позиционные параметры:

set -- *

Затем переверните этот список:

names=()
for name do
    shift
    names[$#]=$name
done

Это создает массив с именем names, который содержит совпадения шаблона подстановки *в обратном порядке.

Реверсирование выполняется путем итерации по позиционным параметрам (результата сопоставления )по порядку и для каждой записи путем вставки ее в положение, которое она занимала бы в обратном списке. $#— это количество позиционных параметров, (совпадений с нашим шаблоном подстановки ), а shiftудаляет один из этого списка, уменьшая $#на единицу на каждой итерации, поэтому мы вставляем элементы с начала список позиционных параметров в конец массива names.

Получив массив names, распечатайте его:

printf '%s\n' "${names[@]}"

... или делайте с ним все, что вам нужно.

Это не будет таким же, как ls -r *, так как команда lsбудет отображать содержимое любого каталога, соответствующего глобусу *.

Если шаблон ничему не соответствует, bashоставит шаблон нераскрытым. Используйте shopt -s nullglobдля установки опции оболочки nullglob, которая при активации полностью удалит шаблон, если он не соответствует ни одному имени. Для сопоставления скрытых имен дополнительно установите параметр оболочки dotglob.

3
28.04.2021, 23:26

Переносится на большинство оболочек, избегайте ошибок с одним файлом (используя только seqи оболочку, заданную printf, setиeval):

set -- *
[ $# -gt 1 ] && eval set -- "$(printf "\"\${%s}\" " $(seq "$#" -1 1))"
printf '%s '   "$@"

Разумно установить nullglob и failglob там, где они доступны.

0
28.04.2021, 23:26

Вы не говорите, какую оболочку вы используете, я еще ни разу не сталкивался с оболочкой, которая размещалась бы в каком-либо порядке, кроме восходящего буквенно-цифрового. Так что это то, что вам нужно сделать с ls, sortили что-то в этом роде. См. вики shellcheck , чтобы узнать, почему перебор вывода lsненадежен и что с этим делать. По сути, есть две основные проблемы, на которые следует обратить внимание: :1 ), когда каталог пуст, echo *по умолчанию печатает *. 2 )Если у вас есть файлы с пробелами в именах, это может запутать все, что читает ввод. Для (1 ), если вы используете bash, вам нужно установить параметр nullglob. Для (2 )вы, вероятно, захотите написать что-то вроде

ls -1r | while read filename; do
   ...
done

(еще раз, если вы используете sh, bashили zsh.)

0
28.04.2021, 23:26

Теги

Похожие вопросы