Я думаю, что очень трудно рекомендовать что-то здесь. Если Вы чувствуете себя прекрасно с Debian, остаются с ним. Для правильного решения для виртуализации я рекомендовал бы KVM, потому что это хорошо интегрируется в ядро, и это работает таким же образом многими другими инструментами Linux. Я понятия не имею, насколько хороший это когда дело доходит до связанных с GPU задач. Я просто испытал бы его.
Также знайте, что устойчивость ОС во многом зависит от аппаратных средств и драйверов для их.
BTW я использую KVM на openSUSE 11.4 без любых проблем.
Не анализируйте находят вывод и просто используют оболочку globbing - это более безопасно и встроено в оболочку. Shell, созданный-ins как for
не подвергаются тому же пределу длины списка аргументов как внешние процессы, так как никакие вызовы не делают exec*
сделаны.
for dir in ./*/; do
# ...
done
Если Вы имеете bash 4
, можно сделать что-то рекурсивное как:
shopt -s globstar
for dir in **/; do echo "$dir"; done
Я не соглашаюсь с ответом, который Вы приняли - Вы столкнетесь с проблемами памяти, если Вы будете использовать $(find)
, даже без exec
существующий.
Вместо этого запишите это как
find . -type d | while IFS= read -r dir
do
# My code
done
(Примечание: это предполагает, что нет никакого имени каталога, содержащего символ новой строки.)
Затем Вам не будет нужна временная память для хранения find
вывод, как Вы были бы с заменой команды. Это также работало бы если find
или другая команда никогда не завершалась, например:
# will not work!
for line in $(yes) ; do echo "$line" ; done
# works
yes | while IFS= read -r line ; do echo "$line" ; done
find
также заблокируется при записи его вывода. Другими словами, find
будет просто ожидать, если цикл не может поддержать на высоком уровне.
– Jim Paris
05.10.2012, 20:19
Не генерируйте имена файлов с заменой команды: это повредится, если имена файлов будут содержать пробел или \[?*
.
С ударом ≥4, ksh93 или zsh, можно избежать большей части использования find
то единственное использование -type d
или -name …
предикаты при помощи **
шарик для соответствия подкаталогам на любой глубине. В ударе, выполненном shopt -s globstar
сначала. В ksh, выполненном set -o globstar
сначала.
for dir in **/; do …; done
Портативно, или в случаях, где Вам нужен больше, использовать find … -exec … +
или find … -print0 | xargs -0 …
. Этот подход обладает дополнительным преимуществом выполнения find
несколько параллельно с действием с файлами, хотя это только становится верным для огромных деревьев каталогов (по крайней мере, тысячи соответствия файлам). Можно сделать find
или xargs
выполните оболочку, если необходимо сделать более, чем выполненный одну команду.
find -type d -exec sh -c 'for x in "$@"; do echo "$x"; done' _ {} +
(Это _
$0
в отрывке оболочки, который мы не используем.)
find -exec
или регистрируйте времяfor
цикл. Просто не пытайтесь проанализировать выводfind
или что-либо, что просто печатает имена файлов. – jw013 05.10.2012, 03:58\0
и/
. Подобные вещи являются в основном двоичными блобами и не могут быть надежно проанализированы с помощью вещей как замена команды - слишком много возможных забавных символов, чтобы испортить парсинг. Попробоватьmkdir test && cd test && mkdir 'one dir' && for dir in $(find . -type d); do printf '%s\n' "$dir"; done
. Необходимо видеть два каталога,one
иdir
. – jw013 05.10.2012, 04:19