попробуйте
echo 32768 > /sys/block/md0/md/stripe_cache_size
и проверьте;)
Попробуйте процитировать цикл for следующим образом:
for FILE in "`find . -type f -name '*.*'`" # note the quotation marks
Без кавычек bash не обрабатывает пробелы и символы новой строки (\n) хорошо ...
Также попробуйте установить
IFS=$'\n'
Это работает и упрощается:
find . -name '<pattern>' | while read LINE; do echo "$LINE" ; done
Подпишитесь на Rupa (https://github.com/rupa/z) для этого ответа.
В дополнение к правильному цитированию вы можете указать find использовать разделитель NULL, а затем читать и обрабатывать результаты в цикле while
while read -rd $'\0' file; do
something with "$file"
done < <(find . -type f -name '*.*' -print0)
. Это должно обрабатывать любые имена файлов, которые совместимы с POSIX - см. man find
-print0
True; print the full file name on the standard output, followed by a null character (instead of the newline character that -print uses). This allows file
names that contain newlines or other types of white space to be correctly interpreted by programs that process the find output. This option corresponds to the
-0 option of xargs.
Я сделал что-то вроде этого, чтобы найти файлы, которые могут содержать пробелы.
IFS=$'\n'
for FILE in `/usr/bin/find $DST/shared -name *.nsf | grep -v bookmark.nsf | grep -v names.nsf`; do
file $FILE | tee -a $LOG
done
Работали как шарм:)
Большинство ответов здесь разбиваются, если в имени файла есть символ новой строки. Я использую bash более 15 лет, но только интерактивно.
В Python вы можете использовать os.walk (): http://docs.python.org/2/library/os.html#os .walk
И модуль tarfile: http://docs.python.org/2/library/os.html#os.walk
Я думаю, вам может быть лучше с использованием опции -exec find.
find . -type f -name '*.*' -exec tar -cpf archive.tar {} +
Затем найдите команду, используя системный вызов, чтобы сохранить пробелы и символы новой строки (а не pipe, для чего требуется котирование специальных символов). Обратите внимание, что «tar -c» работает независимо от того, существует или нет архив, и что (по крайней мере, с bash) ни {}, ни + не нужно указывать.
Как показано в minerz029, вам нужно указать расширение команды find. Вы также должны процитировать все подстановки $FILE в вашем цикле.
for FILE in "$(find . -type f -name '*.*')"
do
if [ ! -f archive.tar ]; then
tar -cpf archive.tar "$FILE"
else
tar -upf archive.tar "$FILE"
fi
done
Обратите внимание, что синтаксис $() должен быть предпочтительнее использования обратных тактов; см. этот U & amp; L вопрос. Я также удалил ключевое слово [[ и заменил его командой [, потому что это POSIX.