Существуют на Солярисе x86-64 некоторые очень большие файлы, размер которых превышает 263, то есть, максимальный размер, представимый в off64_t
. Это включает файл, представляющий адресное пространство процесса в proc
(/proc/<pid>/as
).
Иметь дело с этими файлами:
fopen
, fseek
, и т.д. не доверяйте libc потоковым стандартным программам, которые (на версиях Соляриса я протестировал), искажают плохо "недопустимые" смещения.open64
, read
.Искать:
static off64_t lseeku64(int file, uint64_t offset /* eg from pr_argv */)
{
#ifndef __sun
if (offset > 0x7FFFFFFFFFFFFFFFllu) return -1;
#endif
return lseek64(file, offset, SEEK_SET);
}
Таким образом, на Солярисе мы знаем, что можем сделать этот бросок из-за контроля источников OpenSolaris, но мы должны постараться не предполагать, что он работает над другими платформами с psinfo
и pr_argv
(например, AIX).
Но, передайте в своем очень большом смещении, и оно действительно все "просто работает".
У Вас, скорее всего, есть проблема, потому что Вы не заключаете имена файлов в кавычки:
for f in */*.bmp ; do convert "$f" "${f%bmp}png" ; done
# ^ ^ ^ ^
сделайте это так, пространство в именах файлов не вызывает проблемы.
Я осуществил бы рефакторинг код как это. Я нахожу, что этот метод является более четким и легче отладить:
find . -type f -name '*.bmp' |\
while read BMP
do
DIR=$(dirname "$BMP")
PNG="$(echo $BMP | sed 's/.bmp//g')"
convert "${BMP}" "${PNG}".png
done
find | while read
, особенно, когда шарик будет достаточен.
– Kevin
15.12.2013, 20:17
's/\.bmp$/.png/'
, затем, очевидно, удалите .png из фактической команды
– Kevin
15.12.2013, 20:19
$f
должен быть заключен в кавычки также – Mat 15.12.2013, 12:50*/*.bmp
. – evilsoup 15.12.2013, 14:04