объединение массива из шаблона генерации расширенного имени файла

Если он был установлен в режиме сервера, по умолчанию у него не будет графического интерфейса.

Вам нужно выбрать один для установки с помощью yum

чтобы получить список пакетов yum, которые могут работать, запустите

yum grouplist

Если доступно, запустите

yum groupinstall "Server with GUI"

или

yum groupinstall "X Window System"

Для просмотра режима переключения GUI с помощью

init 5
3
22.05.2020, 21:15
1 ответ

Еще несколько вариантов:

  • использовать анонимную функцию:

    (){ files=${(F)@}; } *(U.^D)
    
  • использоватьprintf -v:

    printf -v files '%s\n' *(U.^D)
    

    (что у одного есть \nв конце ). $filesне должен быть заранее объявлен как массив.

  • вы не можете напрямую назначать расширения глобусов скалярной переменной в одном назначении, поскольку глобусы генерируют списки , поэтому они подходят только для присваивания массивам или ассоциативным массивам. Если вы действительно хотели (, но мне непонятно, почему вы ), вы можете обойти это, используя подстановку команд, как показал @Gilles, хотя это означает разветвление подоболочки и удаление всех завершающих строк новой строки.

    Другой подход, не связанный с разветвлением, заключается в использовании zshфункции динамического именованного каталога , которая является одним из способов вызова пользовательского кода для создания пользовательского расширения.

    zsh_directory_name_functions+=(expand-glob)
    expand-glob() {
      emulate -L zsh
      set -o extendedglob
      local match
      [[ $1 = n && $2 = (#b)glob:(*):(*) ]] && {
        local sep=$match[1]
        reply=(${~match[2]}(#qN))
        reply=(${(pj:$sep:)reply})
      }
    }
    

    , а затем выполните:

    files=~[glob:$'\n':*(#qU.^D)]
    

Но ты уверен, что хочешь именно этого? Как только вы соедините эти файлы любым символом, кроме /или \0, вы не сможете вернуть исходный список файлов, так как эти(/и\0)— единственные символы, которые не могут встречаться в имя файла.

Почему бы не хранить данные в массиве?:

files=(*(NU.^D))

Тогда вы знаете, что ничего не теряете.

И если вам нужно распечатать этот список пользователю, вы всегда можете сделать:

print -rC1 -- $files

Либо используя любую из поддерживаемых zshформ цитирования, чтобы не потерять информацию:

print -rC1 -- "${(@q+)files}" # human friendly
print -rC1 -- "${(@qq)files}" # safe for reinput to the shell or z flag

Обратите внимание, что эти [^.]или ^Dдолжны быть необходимы только в том случае, если вы в противном случае установили параметр dotglobглобально.

print -C1печатает в один столбец,это то же самое, что и print -l, за исключением случая пустого списка аргументов (, что может произойти здесь, поскольку я использовал квалификатор Nullglob glob, чтобы избежать ошибки, если нет соответствующего файла ), где последний все еще выводит пустую строку.

Если вы хотите сохранить этот список файлов в файл, чтобы вы могли редактировать его и загрузить результат позже, сохраняя при этом всю информацию, вы можете:

files=(*(.U^D))
printf '%q\n' $files > file

При использовании %qимена файлов заключаются в кавычки с использованием zshкавычек, поэтому, например, файл с именем foo<newline>barбудет отображаться как $'foo\nbar'.

Затем вы можете загрузить отредактированный файл в новый массив с чем-то вроде:

newfiles=("${(f@Q)$(<file)}")

Где флаг раскрытия параметра Qотменяет заключение в кавычки.

А потом сделать:

(($#files == $#newfiles)) &&
   for old new (${files:^newfiles}) mv -i -- $old $new
1
18.03.2021, 23:33

Теги

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