Патч ядра linux-vserver и связанное с ним пользовательское пространство (см. http://linux-vserver.org/) позволяют запускать программы в их собственных изолированных контейнерах, не требуя полной виртуализации гостевой ОС.
Контейнеры linux-vserver имеют собственное пространство имен монтирования, собственное сетевое пространство имен, собственный контекст безопасности и т.д.
Обратите внимание, что linux-vserver был разработан в основном для запуска серверов; хотя вы можете запускать настольные приложения в контейнере linux-vserver, вам нужно будет знать, что вы делаете.
Другой подход заключается в использовании AppArmor для ограничения того, что разрешено делать вашей программе.
Вы можете использовать find... -type f
с циклом bash for -. В цикле комбинация mkdir -p
и dirname
позволит вам воссоздать структуру папок перед простым копированием каждого файла с помощью cp.
#!/bin/bash
dirA="/NAS/data/dir1/"
dirB="/mnt/databackup/dir1/"
while read -r file
do
relative="${file##"$dirA"}"
newfile="$dirB$relative"
echo mkdir -p "$(dirname "$file")"
echo cp -at "$file" "$newfile"
done < <(find "$dirA" -type f -mtime -1)
read
— это встроенная функция bash. Он классически используется с -r
, чтобы избежать некоторых проблем с граничным -случаем. Он читает по одной строке (за раз )из своего stdin
. Здесь stdin
является результатом find
. ${var##string-to-remove}
является формой подстановки параметров newfile="$dirB$relative"
. Это классическая конкатенация bash $()
. Эта конструкция bash называется подстановкой командmkdir -p
создать каталог и всех его предков по мере необходимости cmd < file
это классическое перенаправление <(cmd)
это называется подстановкой процесса . Он заменяет имя файла в качестве дескриптора стандартного ввода [>()
] или стандартного вывода [<()
] команды. Вы можете использовать сайт объяснения для получения более подробных объяснений.