Только один файл, отраженный от массива файлов

Это вызвано неправильно настроенным разрешением на устройстве /dev/kvm. Это должно иметь разрешение на чтение от группы kvm. Шаги для решения:

  1. Создайте файл /etc/udev/rules.d/65-kvm.rulesкакroot
  2. Поместите следующую строку в этот файл:KERNEL=="kvm", NAME="%k", GROUP="kvm", MODE="0660"
  3. Перезагрузить правила с помощьюudevadm control --reload-rules && udevadm trigger
  4. С пользователем, который является членом группы kvm, попробуйте выполнить qemuс опцией -enable-kvm.

Это было давно исправлено в Arch Linux (, задача 14165, апрель 2009 г.). Возможно, вам также следует сообщить об этой проблеме в список разработчиков вашего дистрибутива.

4
18.08.2019, 18:19
4 ответа

Это Bashфункция, описанная вman bash:

Referencing an array variable without a subscript is equivalent to referencing the array with a subscript of 0.

Если вы хотите распечатать все элементы массива files:

echo "${files[@]}"

Также описано вman bash:

${name[@]} expands each element of name to a separate word.

7
27.01.2020, 20:47

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

IFS=$'\n'
cp -a $( printf "source_path/%s\n" "${files[@]}" ) /destination_path/

Он также должен работать с именами файлов с пробелами.

-1
27.01.2020, 20:47

$filesи ${files[0]}эквивалентны, когда files- это список, подобный тому, который у вас есть в вашем вопросе.

Обратите внимание, что "source_path/${files[@]}"помещает source_path/только перед первым элементом списка. Чтобы изменить список таким образом, чтобы каждый элемент начинался с некоторого пути, вы можете сделать

files=(... your list of files... )

for element in "${files[@]}"; do
    files=( "${files[@]:1}" "source_path/$element" )
done

cp "${files[@]}" destanation_path

или вы можете просто cdдо source_pathперед выполнением cpили добавить путь к фактическим именам одновременно с назначением значений в списке с самого начала.

3
27.01.2020, 20:47

Как указывали другие, $filesрасширяется только до первого элемента массива, а "source_path/${files[@]}"только прикрепляет «источник _путь/» к первому элементу. Но есть относительно простой способ получить все элементы с добавлением пути к каждому:

cp -a "${files[@]/#/source_path/}" "/destanation_path"

Это объединяет расширение всех -элементов([@])с подстановкой. /#означает «заменить в начале строки», затем пустая строка для замены, затем /для разграничения замены, затем «источник _путь/» как то, что нужно заменить (/добавить ). Это прикрепляет исходный путь к каждому элементу и не путает забавные символы в элементах, как это делают некоторые версии.

Обратите внимание, что в приведенном выше примере «источник _путь/» имеет косую черту в конце, но не в начале; "/" прямо перед ним является разделителем. Если бы он начинался с косой черты и содержал больше косых черт, например «/source/path/», он все равно работал бы :

.
cp -a "${files[@]/#//source/path/}" "/destanation_path"
3
27.01.2020, 20:47

Теги

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