Это относится к ядру Linux; я не уверен, как любое ядро Unix обрабатывает это.
Верхняя память является сегментом памяти, к которой могут обратиться программы пространства пользователя. Это не может коснуться Низкой Памяти.
Низкая Память является сегментом памяти, к которой ядро Linux может обратиться непосредственно. Если ядро должно получить доступ к Верхней памяти, оно должно отобразить его в свое собственное адресное пространство сначала.
Был патч, представленный недавно, который позволяет Вам управлять, где сегмент. Компромисс - то, что можно устранить адресуемую память из пространства пользователя так, чтобы ядро могло иметь больше памяти, перед использованием которой это не должно отображаться.
Дополнительные ресурсы:
Что касается find
команда, можно также просто добавить больше -exec
команды подряд:
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
Обратите внимание, что эта команда, в ее результате, эквивалентном из использования
chgrp-v new_group файл && chmod-v 770 файла
на каждом файле.
Весь find
параметры такой как -name
, -exec
, -size
и так далее, на самом деле тесты: find
продолжит выполнять их один за другим, пока вся цепочка до сих пор оценила к истинному. Так каждый последовательный -exec
команда выполняется, только если предыдущие возвратили true (т.е. 0
статус выхода команд). Но find
также понимает логические операторы такой как или (-o
) и не (!
). Поэтому использовать цепочку -exec
тесты независимо от предыдущих результатов, нужно было бы использовать что-то вроде этого:
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;
-c
нечетная обработка 0$ заставляет меня думать, что это неправильно каждый раз, когда я гляжу на нее, но его определенно корректный.
– derobert
24.08.2012, 19:52
Ваша команда сначала анализируется оболочкой в две команды, разделенные a ;
, который эквивалентен новой строке:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Если Вы хотите выполнить команду оболочки, вызовите оболочку явно с bash -c
(или sh -c
если Вы не заботитесь, что оболочка является конкретно ударом):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
Отметьте использование {}
как аргумент оболочке; это - нулевой аргумент (который обычно является названием оболочки или сценария, но это не имеет значения здесь), следовательно ссылаемый как "$0"
.
Можно передать несколько имен файлов оболочке за один раз и заставить оболочку выполнить итерации через них, это будет быстрее. Здесь я передаю _
поскольку название сценария и следующие аргументы являются именами файлов, который for x
(ярлык для for x in "$@"
) выполняет итерации.
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
Обратите внимание, что начиная с удара 4, или в zsh, Вы не должны находить вообще здесь. В ударе, выполненном shopt -s globstar
(вставьте его Ваш ~/.bashrc
) активироваться **/
положение рекурсивного шарика каталога. (В zsh это активно все время.) Затем
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
или если Вы хотите, чтобы файлы были выполнены с помощью итераций на в порядке
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
Одно различие с find
команда состоит в том, что оболочка игнорирует точечные файлы (файлы, имя которых начинается с a .
). Включать их, в ударе, сначала набор GLOBIGNORE=.:..
; в zsh использовать **/*(D)
как шаблон шарика.
'{}'
(апострофы вокруг фигурных скобок), посетите: unix.stackexchange.com/q/8647/4485 – user unknown 05.08.2011, 01:37