$ man mkfs.ext4
The size of the journal must be at least 1024 filesystem blocks (i.e., 1MB if using 1k blocks, 4MB if using 4k blocks, etc.) and may be no more than 102,400 filesystem blocks.
Я думаю, что размер по умолчанию составляет 128 МБ, но не уверенный, который мог бы быть датирован. Так или иначе я не думаю, перемещая журнал в другой раздел на том же жестком диске, будет улучшение. Если Вы перемещаетесь в другой физический диск, который может помочь.
Лучшее, которое можно сделать, должно попробовать различные размеры и выдержать сравнение с текущим состоянием с реальной рабочей нагрузкой (не некоторый инструмент сравнительного теста, который может или не может моделировать операции, подобные реальной рабочей нагрузке).
Вы могли объявить variable
как переменная среды, т.е.
export variable="Filename:"
Не ответ на Ваш вопрос, но не делайте:
find . -type f -exec bash -c 'myfunction "{}"' \;
Около того, что это не портативно, это также очень опасно, потому что имена файлов заканчивают тем, что были интерпретированы bash
как окружают код. Рассмотрите, например, что произошло бы, если бы был названный файл $(rm -rf ~)
там. Запишите это:
find . -type f -exec bash -c 'myfunction "$1"' find+bash {} \;
Или еще лучше (чтобы не выполнять тот bash
на файл):
find . -type f -exec bash -c 'for file do
myfunction "$file"; done' find+bash {} +
Теперь ответ на Ваш вопрос быть по теме:
Вы могли сделать:
{ find . -type f -exec printf '%s\0' {} + | while IFS= read -ru3 -d '' file; do
myfunction "$file"; done 3<&0 <&4 4<&-; } 4<&0
Тем путем Вы звоните myfunction
в токе bash
оболочка, таким образом, Вы не должны экспортировать myfunction
или выполненный дополнительный bash
оболочки.
Если Ваш find
поддержки -print0
предикат (как GNU, busybox и некоторый BSDs find
s), можно заменить -exec printf '%s\0' {} +
с -print0
Я сделал бы это следующим образом
#!/bin/bash
myfunction() {
local var="Filename: "
local file=$1
echo "$var" "$file"
}
export -f myfunction
find . -type f -exec bash -c 'myfunction {}' \;
Объявите Вар как локальный и передача '{}' к функции, которая является $1
сначала позиционный параметр.
var
в Вашем примере), определяется вне функции в моем случае.
– DustByte
27.08.2013, 17:58
variable
движение должно выполнить / часть самой функции.
– Valentin Bajrami
27.08.2013, 18:03
Когда Вы присваиваете переменной, она начинается как переменная оболочки. Для получения переменной среды, которая передается подпроцессам, необходимо экспортировать ее.
variable="Filename:"
export variable
Можно поместить присвоение на ту же строку как export
: export variable="Filename:"
.
Переменная будет видима к оболочкам, запущенным find
, но не функции. В ударе можно также экспортировать функции. Эта возможность не присутствует в ksh, тире и других оболочках, которые часто используются как sh
потому что они быстрее и более минимизированы.
export -f myfunction # bash only
Никогда не используйте {}
в строке в find -exec …
(или xargs …
), если Вы не знаете, что Ваши имена файлов являются алфавитно-цифровыми. Если будут какие-либо специальные символы в именах файлов, то они будут проанализированы как таковые внутренней оболочкой. Вместо этого передайте имена файлов командной строке оболочки.
find . -type f -exec bash -c 'for x; do myfunction "$x"; done' _ {} +
С оболочками кроме удара определите функцию во внутренней оболочке или просто поместите ее код непосредственно.
С другой стороны, в ударе, можно использовать рекурсивный globbing вместо находки. Остерегайтесь тот удар пересекает символьные ссылки на каталоги.
variable="Filename:"
myfunction () { … }
shopt -s globstar dotglob
for x in **/*; do
if [[ -f $x ]]; then myfunction "$x"; fi
done
find
), например, наличие строки, говорящей просто myfunction "hello.txt"
.
– DustByte
28.08.2013, 12:46